實現(xiàn)單點登錄說到底就是要解決如何產(chǎn)生和存儲那個信任,再就是其他系統(tǒng)如何驗證這個信任的有效性,因此要點也就以下兩個:1、存儲信任 ;2、服務(wù)器生產(chǎn)~驗證信任 ; 3、拿到服務(wù)器再次驗證。
單點登錄的常見落地實現(xiàn)技術(shù)有哪些?
身份認證技術(shù):
1. cas(單點登錄)
2. Spring Security OAuth2(第三方登錄授權(quán):QQ登陸)
3. jwt (客戶端token:原生)
安全控制框架:
1. spring-security
2. shiro:
cas(單點登錄)
解決問題:多個系統(tǒng)只需登錄一次,無需重復登錄
原理:授權(quán)服務(wù)器,被授權(quán)客戶端 CS架構(gòu)
1. 授權(quán)服務(wù)器(一個)保存了全局的一份session,客戶端(多個)各自保存自己的session
2. 客戶端登錄時判斷自己的session是否已登錄,若未登錄,則(告訴瀏覽器)重定向到授權(quán)服務(wù)器
(參數(shù)帶上自己的地址,用于回調(diào))
3. 授權(quán)服務(wù)器判斷全局的session是否已登錄,若未登錄則定向到登錄頁面,提示用戶登錄,登錄成
功后,授權(quán)服務(wù)器重定向到客戶端(參數(shù)帶上ticket【一個憑證號】)
4. 客戶端收到ticket后,請求服務(wù)器獲取用戶信息
5. 服務(wù)器同意客戶端授權(quán)后,服務(wù)端保存用戶信息至全局session,客戶端將用戶保存至本地session
6. 默認不支持http請求, 僅支持https 。 生成證書 keytools
缺點:cas單點登錄技術(shù)適用于傳統(tǒng)應(yīng)用的場景比較多, 官方示例也是以javaWeb為準, 對微服務(wù)化應(yīng)
用,前后端分離應(yīng)用,支持性較差。
oauth2(第三方登錄授權(quán))
解決問題:第三方系統(tǒng)訪問主系統(tǒng)資源,用戶無需將在主系統(tǒng)的賬號告知第三方,只需通過主系統(tǒng)的授
權(quán),第三方就可使用主系統(tǒng)的資源
如:APP1需使用微信支付,微信支付會提示用戶是否授權(quán):取消,用戶授權(quán)后,APP1就可使用微信支
付功能了。
OAuth2是用來允許用戶授權(quán)第三方應(yīng)用訪問他在另一個服務(wù)器上的資源的一種協(xié)議,它不是用來做單
點登錄的,但我們可以利用它來實現(xiàn)單點登錄。
原理:主系統(tǒng),授權(quán)系統(tǒng)(給主系統(tǒng)授權(quán)用的,也可以跟主系統(tǒng)是同一個系統(tǒng)),第三方系統(tǒng)。
1. 第三方系統(tǒng)需要使用主系統(tǒng)的資源,第三方重定向到授權(quán)系統(tǒng)
2. 根據(jù)不同的授權(quán)方式,授權(quán)系統(tǒng)提示用戶授權(quán)
3. 用戶授權(quán)后,授權(quán)系統(tǒng)返回一個授權(quán)憑證(accessToken)給第三方系統(tǒng)【accessToken是有有效
期的】
4. 第三方使用accessToken訪問主系統(tǒng)資源【accessToken失效后,第三方需重新請求授權(quán)系統(tǒng),以
獲取新的accessToken】
Resource Server: 被授權(quán)訪問的資源
Authotization Server:OAUTH2認證授權(quán)中心
Resource owner : 資源擁有者
Client:使用API的客戶端(如Android 、IOS、web app)
jwt (客戶端token)
難度較大,需要你了解很多協(xié)議~
Json web token (JWT),是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC
7519).
該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用
來在身份提供者和服務(wù)提供者間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增
加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
基于JWT認證協(xié)議,自己開發(fā)SSO服務(wù)和權(quán)限控制。
SpringSecurity
springSecurity 是spring家族的安全控制框架, 功能非常完善。
Spring Security是能夠為J2EE項目提供綜合性的安全訪問控制解決方案的安全框架。
它依賴于Servlet過濾器。這些過濾器攔截進入請求,并且在應(yīng)用程序處理該請求之前進行某些安全處
理。
Shiro
spring-boot-starter-springsecurity
特征 spring-security + oauth2 shiro + cas jwt
依賴 jdk、jwt、redis redis、jdk、jwt --
自定義
權(quán)限
支持,用戶登錄后將用戶的權(quán)限列表
寫入認證服務(wù)器
支持 , 用戶登錄后將用戶
的權(quán)限列表寫入客戶端 支持
認證服
務(wù)集群 -- CAS支持 支持
共享
session
支持 支持 支持
前后端
分離 支持,參數(shù)始終攜帶access_token
支持不夠友好,需要改造
CAS服務(wù)端 支持
Apache Shiro 是一個強大而靈活的開源安全框架,它干凈利落地處理身份認證,授權(quán),企業(yè)會話管理
和加密。
以下是 Apache Shiro 可以做的事情:
1. 驗證用戶來核實他們的身份
2. 對用戶執(zhí)行訪問控制
3. 判斷用戶是否被分配了一個確定的安全角色
4. 判斷用戶是否被允許做某事
5. 在任何環(huán)境下使用 Session API,即使沒有 Web 或 EJB 容器。
6. 在身份驗證,訪問控制期間或在會話的生命周期,對事件作出反應(yīng)。
7. 聚集一個或多個用戶安全數(shù)據(jù)的數(shù)據(jù)源,并作為一個單一的復合用戶“視圖”。
8. 啟用單點登錄(SSO)功能。內(nèi)置了jasig-cas
9. 為沒有關(guān)聯(lián)到登錄的用戶啟用"Remember Me"服務(wù)。
市面主流的技術(shù)搭配
搭配方案一
搭配方案二
技術(shù)人員態(tài)度: 通吃才對!大家覺得這個課程對大家有幫助嗎?敬請關(guān)注,下一個文章告訴大家具體的代碼實現(xiàn)方案!