本篇文章簡單介紹了一下sso的概念及原理,然後使用springboot+redis實現了乙個簡單的sso系統。系統使用ticket的形式,依靠cookie攜帶ticket向sso伺服器進行驗證,驗證通過後允許訪問請求位址。
sso(single sign on),單點登入,簡單來說就是在乙個具有多個子系統的系統中,只用登入乙個子系統,然後訪問其他子系統時不需要再次登入,即「一次登入,多處訪問」,能夠有效的提公升使用者體驗。
單點登入的大致流程如下(基於cookie):
1.使用者首次訪問a系統,a系統發現使用者未登入,則重定向到sso認證中心並攜帶請求url,進行登入驗證;
2.使用者在sso認證中心進行使用者名稱和密碼驗證登入,登入成功後,伺服器生成乙個ticket,然後重定向到系統a的源url並將該ticket追加到url引數。
3.系統a獲取到url引數中的ticket,向sso發起ticket較驗,較驗成功,則系統a放行,並將ticket存入到cookie。
4.使用者訪問b系統,此時b系統domain下已經攜帶ticket,直接向sso發起ticket較驗,較驗成功,則放行,並將ticket存入cookie(更新ticket過期時間)
5.使用者登出時,移除domain下的cookie。
流程圖大致如下:
### 實現原理使用一種一次性的ticket,即乙個ticket只能使用一次,用過之後立馬失效,來保證ticket的安全性。
請看專案原始碼:
1.使用cookie還是url?
對於ticket的傳輸,一直在糾結使用cookie還是url附加引數的形式,最後處於方便考慮,還是使用了cookie。
2.如何保證ticket的安全性?
這個問題也困擾了我一下午,一直在尋求一種完美的、安全的ticket傳遞形式,最後明白了,在網路上沒有絕對的安全,當破解它所帶來的利益小於破解後所帶來的利益時,他就是安全的,即安全是相對的。所以既然ticket是作為cookie或者url引數傳遞的,那麼它的安全性本來就沒***,我們能保證的是如何對ticket進行較驗,如何驗證拿到同乙個ticket的使用者是同乙個使用者。對於這個問題,我使用了一種一次性的ticket,上邊也說了,這樣雖然不能保證絕對的安全,但是在某種程度上能夠有效防止他人直接截獲cookie而獲得許可權。
3.關於cookie的domian
在測試過程中發現cookie寫入的都是二級網域名稱,例如aa.test.com而不是test.com,這導致其他系統無法共享cookie而導致單點登入失敗,解決辦法是直接設定domain為.test.com即可,注意前面的點不能省略。其次直接在yml裡使用如下配置設定cookie的domain是無效的
server:
servlet:
session:
cookie:
domain: .test.com
4.登出時直接請求sso-server還是請求子系統?考慮到是子系統之間共享的cookie,所以清除子系統的cookie即可。
所用測網域名稱:
127.0.0.1 aa.test.com
127.0.0.1 aa.test.com
#對應sso-server,埠為8080
127.0.0.1 sso.com
1.首先啟動這三個專案,並啟動redis
SSO單點登入原理
單點登入系統 在系統a登入後,進入系統a和b均不用登入 那麼具體如何實現呢?如圖 1 訪問系統a,但因為沒有登入狀態,所以重定向到認證服務進行登入 2 登入成功後,讓瀏覽器儲存乙個cookie在xxlssoserver.com下,並請求重定向到系統a,3 重定向到系統a,並攜帶cookie,同時讓瀏...
單點登入SSO的實現原理
單點登入sso的實現原理 單點登入sso single sign on 說得簡單點就是在乙個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。單點登入在大型 裡使用得非常頻繁,例如像阿里巴巴這樣的 在 的背後是成百上千的子系統,使用者一次...
單點登入SSO的實現原理
單點登入sso single sign on 說得簡單點就是在乙個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。單點登入在大型 裡使用得非常頻繁,例如像阿里巴巴這樣的 在 的背後是成百上千的子系統,使用者一次操作或交易可能涉及到幾十個...