天天看點

SSO跨域單點登入實作方案

SSO簡介

定義:

傳統的單站點登入通路授權機制是:登入成功後将使用者資訊儲存在session中,sessionId儲存在cookie中,每次通路需要登入通路的資源(url)時判斷目前session是否為空,為空的話跳轉到登入界面登入,不為空的話允許通路。

 單點登入是一種多站點共享登入通路授權機制,通路使用者隻需要在一個站點登入就可以通路其它站點需要登入通路的資源(url)。使用者在任意一個站點登出登入,則其它站點的登入狀态也被登出。簡而言之就是:一處登入,處處登入。一處登出,處處登出。

應用場景:

當一個網站系統稍微複雜一些的時候,需要對業務進行拆分,比如一個電商網站,可以将商品搜尋、商品詳情、購物車、訂單等拆分成一個個子系統,。當一個系統拆分成多個子系統的時候就需要單點登入來做授權了。

解決方案:

SSO跨域單點登入實作方案

業務需求:

最近公司因為業務需要開發了一些子系統需要和主站進行內建,在網上看了好多單點登入的教程,綜合各種情況總結出了了下面的單點登入實作思路。其中用到了輪詢跳轉的思路來解決同時給多個分站寫cookie的問題。如有不妥之處歡迎各位批評指正。 

實作功能:

1.可完全跨域

2.url透明(分站跳轉不需要url傳遞token或者ticket)

3.同步登出

4.一次将cookie寫入到多個分站 

效果預覽 :

SSO跨域單點登入實作方案

實作思路

實作難點:

這種方式的難點是:怎麼在a.com登入的時候将cookie同時寫到b.com中。我使用的方式是現在sso.com中維護一個分站集合,在登入成功後以輪詢跳轉的方式将cookie寫到各個分站中。

 具體思路:

 1.第一次通路a.com-> 點選a.com頁面的登入按鈕->跳轉到sso.com進行登入驗證->登入成功後将資料存到cache中->然後以輪詢跳轉的方式依次通路各個分站并将cookie寫到各個分站->最後跳轉到登入來源頁面

2.登入成功後->通路需要登入的資源(url)->背景發送請求到sso.com進行cookie有效性驗證->驗證通過通路資源

代碼分析

 1.建立三個站點:a.com,b.com,sso.com

SSO跨域單點登入實作方案

 2.在a.com中建立home/index頁面,如下:

第一次通路cookie不存在,當以模拟請求的方式到sso.com/login/validateLogin進行驗證的時候傳回error,頁面顯示未登入狀态

SSO跨域單點登入實作方案

對應的view頁面如下:

SSO跨域單點登入實作方案

 sso.com/login/validateLogin對應的代碼:

SSO跨域單點登入實作方案

3.在a.com的首頁點選登入按鈕跳轉到sso.com的登入頁面(login/index)

SSO跨域單點登入實作方案
SSO跨域單點登入實作方案

 4.sso.com中的登入代碼如下:

SSO跨域單點登入實作方案
SSO跨域單點登入實作方案

5.點選登入進入到登入驗證方法

生成token,同時将使用者資訊以token為鍵儲存在cache中并設定過期時間

擷取分站集合,以重定向輪詢的方式依次向每個分站寫cookie,最後重定向到登入來源頁面

登入驗證方法如下:

SSO跨域單點登入實作方案

6.傳回登入來源頁面a.com/home/index或者b.com/home/index

此時a.com和b.com已經都有cookie

7.登出(登出)的處理

登出直接調用sso.com/login/LoginOut方法,如下:

SSO跨域單點登入實作方案

繼續閱讀