本項目主要講解的是單點登錄系統的原理及其實現。
本章主要講解的是同域下單點登錄分析。
同域下SSO分析與設計
流程圖雖然看着複雜,但大家不要被嚇到啦^ _ ^,請大家參照着流程路,聽我下面細細道來~~
詳細流程分析
項目結構
在github的代碼中,我建立了三個項目,分別是服務端SSOServer、客戶端SSOClient、以及兩個集成了客戶端的業務系統app1與aPP2。
SSO流程分析
將SSOServer,app1,app2啓動後,開始SSO流程分析。
1)未登錄訪問業務系統
未登錄訪問業務系統app1的index頁面:請求被客戶端的Filter攔截。
由於沒有token,客戶端Filter控制其進行登錄操作,並將原始的URL作爲請求的參數。
2)用戶執行登錄操作
進入服務端的UserLoginServlet進行登錄操作。進入登錄頁時,獲取URL中的參數——原始的origRUL,將其作爲request對象的屬性,方便後人獲取,並且跳轉到服務端的登錄頁面。
用戶提交表單,服務端獲取表單中信息後,到數據庫中進行查詢。若登錄失敗,則返回原來的登錄頁面,並攜帶原來的URL,將原始的URL作爲表單的隱藏屬性。
若登錄成功則:
1.生成token。
2.將token與其對應的user放到全局唯一數據結構中,方便所有人進行獲取。
3.給該用戶設置一個cookie,值爲token,用戶在下次訪問的時候就會攜帶此cookie,服務端也就可以通過該cookie對其身份進行驗證。
4.判斷原始URL是否爲空,若不爲空則跳轉到原始URL頁面,否則跳轉到成功登錄頁面。
在用戶要跳轉到原始URL頁面的時候,被客戶端的Filter攔截,進行有無token的驗證,由於經過登錄操作在cookie中已經生成了token,故Filter發送Http通信請求服務端進行token有效性的驗證,並將token作爲請求參數。
服務端的TokenValidateServlet獲取參數中的token後,到全局唯一數據結構中查找有無該token對應的user。若沒有,則證明該token可能已經失效或是僞造的,則向客戶端返回空字符串,否則返回查詢到的user信息。
攔截器接收到服務端的返回信息,若爲空字符串則返回原始登錄頁面,並攜帶原始URL,否則通過傳來的用戶信息,對user對象進行還原,方便下個人獲取,攔截操作結束,成功進入了業務系統的index頁面,並將request對象攜帶的user信息顯示出來。
3)業務系統增加自己的攔截器
在通過了客戶端的攔截器之後,業務系統還可以自定義攔截器,從而根據用戶信息獲取與本系統相關的用戶業務信息,或者是對用戶的權限進行進一步的驗證,如:"豬豬"不可訪問index頁面等QAQ。
4)單點退出
服務端從request對象的cookie中獲取token的值,將這個token從全局數據結構中移除,並且將用戶保存有該token的cookie設置爲無效的。
關於代碼部分,我將會在下一章節中進行詳細解釋~~~
大家多多關照!^ _ ^