實現單點登錄說到底就是要解決如何產生和存儲那個信任,再就是其他系統如何驗證這個信任的有效
性,因此要點也就以下兩個:1、存儲信任 ;2、服務器生產~驗證信任 ; 3、拿到服務器再次驗證。

單點登錄的常見落地實現技術有哪些?
身份認證技術:

1. cas(單點登錄)
2. Spring Security OAuth2(第三方登錄授權:QQ登陸)
3. jwt (客戶端token:原生)
安全控制框架:
1. spring-security
2. shiro:
cas(單點登錄)

解決問題:多個系統只需登錄一次,無需重復登錄
原理:授權服務器,被授權客戶端 CS架構
1. 授權服務器(一個)保存了全局的一份session,客戶端(多個)各自保存自己的session
2. 客戶端登錄時判斷自己的session是否已登錄,若未登錄,則(告訴瀏覽器)重定向到授權服務器
(參數帶上自己的地址,用於回調)
3. 授權服務器判斷全局的session是否已登錄,若未登錄則定向到登錄頁面,提示用戶登錄,登錄成
功后,授權服務器重定向到客戶端(參數帶上ticket【一個憑證號】)
4. 客戶端收到ticket后,請求服務器獲取用戶信息
5. 服務器同意客戶端授權后,服務端保存用戶信息至全局session,客戶端將用戶保存至本地session
6. 默認不支持http請求, 僅支持https 。 生成證書 keytools
缺點:cas單點登錄技術適用於傳統應用的場景比較多, 官方示例也是以javaWeb為准, 對微服務化應
用,前后端分離應用,支持性較差。
oauth2(第三方登錄授權)

解決問題:第三方系統訪問主系統資源,用戶無需將在主系統的賬號告知第三方,只需通過主系統的授
權,第三方就可使用主系統的資源
如:APP1需使用微信支付,微信支付會提示用戶是否授權:取消,用戶授權后,APP1就可使用微信支
付功能了。
OAuth2是用來允許用戶授權第三方應用訪問他在另一個服務器上的資源的一種協議,它不是用來做單
點登錄的,但我們可以利用它來實現單點登錄。
原理:主系統,授權系統(給主系統授權用的,也可以跟主系統是同一個系統),第三方系統。
1. 第三方系統需要使用主系統的資源,第三方重定向到授權系統
2. 根據不同的授權方式,授權系統提示用戶授權
3. 用戶授權后,授權系統返回一個授權憑證(accessToken)給第三方系統【accessToken是有有效
期的】
4. 第三方使用accessToken訪問主系統資源【accessToken失效后,第三方需重新請求授權系統,以
獲取新的accessToken】
Resource Server: 被授權訪問的資源
Authotization Server:OAUTH2認證授權中心
Resource owner : 資源擁有者
Client:使用API的客戶端(如Android 、IOS、web app)
jwt (客戶端token)

難度較大,需要你了解很多協議~
Json web token (JWT),是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准((RFC
7519).
該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用
來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增
加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
基於JWT認證協議,自己開發SSO服務和權限控制。
SpringSecurity

springSecurity 是spring家族的安全控制框架, 功能非常完善。
Spring Security是能夠為J2EE項目提供綜合性的安全訪問控制解決方案的安全框架。
它依賴於Servlet過濾器。這些過濾器攔截進入請求,並且在應用程序處理該請求之前進行某些安全處
理。
Shiro

spring-boot-starter-springsecurity
特征 spring-security + oauth2 shiro + cas jwt
依賴 jdk、jwt、redis redis、jdk、jwt --
自定義
權限
支持,用戶登錄后將用戶的權限列表
寫入認證服務器
支持 , 用戶登錄后將用戶
的權限列表寫入客戶端 支持
認證服
務集群 -- CAS支持 支持
共享
session
支持 支持 支持
前后端
分離 支持,參數始終攜帶access_token
支持不夠友好,需要改造
CAS服務端 支持
Apache Shiro 是一個強大而靈活的開源安全框架,它干凈利落地處理身份認證,授權,企業會話管理
和加密。
以下是 Apache Shiro 可以做的事情:

1. 驗證用戶來核實他們的身份
2. 對用戶執行訪問控制
3. 判斷用戶是否被分配了一個確定的安全角色
4. 判斷用戶是否被允許做某事
5. 在任何環境下使用 Session API,即使沒有 Web 或 EJB 容器。
6. 在身份驗證,訪問控制期間或在會話的生命周期,對事件作出反應。
7. 聚集一個或多個用戶安全數據的數據源,並作為一個單一的復合用戶“視圖”。
8. 啟用單點登錄(SSO)功能。內置了jasig-cas
9. 為沒有關聯到登錄的用戶啟用"Remember Me"服務。

市面主流的技術搭配


技術人員態度: 通吃才對!大家覺得這個課程對大家有幫助嗎?敬請關注,下一個文章告訴大家具體的代碼實現方案!