是什么
sso
完整的寫法是Single Sign On,中文的意思是單點登陸,更詳細的解釋是:在多個應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統。
如果不采用單點登陸系統,那么用戶訪問多個應用時是這樣的:
但如果采用了單點登陸系統,那就簡便了很多:
也就是,當你有多個系統時(一般大型企業應用中會有這種需求,比如阿里巴巴),用戶只需要登陸一次,即可訪問所有應用系統,而不需要頻繁登陸。
為什么
為什么要采用sso
,它有什么樣的應用場景呢?前面我們提了一句,就是為了增加用戶體驗,避免用戶重復登陸。特別是在一些大型應用系統中,如果應用系統數量比較龐大,每個系統都需要用戶去重新登陸,那想想都覺得可怕,畢竟現如今這種情況也比較多。基於以上原因(應該不夠完整),單點登陸應用需求應運而生。
怎么實現
上面我們簡單說了sso
的應用場景,以及采用sso
的原因,sso
具體又是如何實現的,它的原理到底是怎樣的呢?現在我們就來探討下吧。
sso
的目的是為了增加用戶體驗,避免每個應用系統都要單獨登陸認證的情況。具體的實現原理大致如下:
將登陸、授權、鑒權等操作單獨抽取出來整合成一個系統,各個用戶系統之間共享用戶信息,當用戶訪問某一個系統時,該系統會根據用戶的請求校驗是否登陸,若未登陸則跳轉至單點登陸系統,用戶登陸成功后,跳轉至原應用系統,同時會將用戶信息存至信息共享區,方便其他應用系統獲取用戶信息,流程圖表示如下:
我承認我畫的圖很一般😂,我要好好努力。關於用戶信息共享的實現方式,大致有如下幾種
- session共享
- cookie共享
- token共享
session共享
將用戶信息存儲在session會話中,設置過期時間,用戶登陸成功后,將用戶會話id返回,每次用戶發送請求時需攜帶sessionid,根據sessionid校驗用戶狀態信息
cookie共享
cookie共享用戶信息,就是將用戶信息通過加密后存儲到客戶端(瀏覽器),用戶發送請求時攜帶cookie數據,而且必須滿足如下條件,才能實現信息共享:
- Domain必須是相同的,也就是所有應用必須是同一個父級域名,如www.taotao.com,Sso.taotao.com,Search.taotao.com,需要設置domain為.taotao.com。
- 設置path:/
存在的問題是若客戶端限制了cookie的使用,這時會比較麻煩
token共享
token共享的方式比較靈活,具體的來說就是,用戶登陸成功后,會返回一個特殊的token串給客戶端,每次發送請求時用戶需攜帶token,token本身可以設置過期時間,客戶端存儲比較方便,可以存在cookie、localstorage、sessionstorage中。
目前常用的解決方案
CAS
cas是 Yale 大學發起的一個企業級的、開源的項目,旨在為 Web 應用系統提供一種可靠的單點登錄解決方法(屬於 Web SSO)
CAS 包括兩部分: CAS Server 和 CAS Client 。CAS Server 負責完成對用戶的認證工作 , 需要獨立部署 , CAS Server 會處理用戶名 / 密碼等憑證(Credentials) 。CAS Client與受保護的客戶端應用部署在一起,以 Filter 方式保護受保護的資源。負責處理對客戶端受保護資源的訪問請求,需要對請求方進行身份認證時,重定向到 CAS Server 進行認證。(原則上,客戶端應用不再接受任何的用戶名密碼等 Credentials)
基本協議過程如下:
JWT
Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准((RFC 7519).該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
這里不做過多說明,因為后面還會詳細講到,會有詳細的講解和示例。
Spring Security
Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架。它是用於保護基於Spring的應用程序的實際標准。
Spring Security是一個框架,致力於為Java應用程序提供身份驗證和授權。與所有Spring項目一樣,Spring Security的真正強大之處在於可以輕松擴展以滿足自定義要求