一武鲁、說明
單點(diǎn)登錄顧名思義就是在多個(gè)應(yīng)用系統(tǒng)中爽雄,只需要登錄一次,就可以訪問其他相互信任的應(yīng)用系統(tǒng)沐鼠,免除多次登錄的煩惱挚瘟。本文主要介紹 同域
和 跨域
兩種不同場(chǎng)景單點(diǎn)登錄的實(shí)現(xiàn)原理,并使用 Spring Security
來實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的跨域 SSO客戶端
饲梭。
?
二乘盖、原理說明
單點(diǎn)登錄主流都是基于共享 cookie
來實(shí)現(xiàn)的,下面分別介紹 同域
和 跨域
下的兩種場(chǎng)景具體怎樣實(shí)現(xiàn)共享 cookie
的
2.1. 同域單點(diǎn)登錄
適用場(chǎng)景:都是企業(yè)自己的系統(tǒng)排拷,所有系統(tǒng)都使用同一個(gè)一級(jí)域名通過不同的二級(jí)域名來區(qū)分侧漓。
舉個(gè)例子:公司有一個(gè)一級(jí)域名為 zlt.com
,我們有三個(gè)系統(tǒng)分別是:門戶系統(tǒng)(sso.zlt.com)监氢、應(yīng)用1(app1.zlt.com)和應(yīng)用2(app2.zlt.com)布蔗,需要實(shí)現(xiàn)系統(tǒng)之間的單點(diǎn)登錄藤违,實(shí)現(xiàn)架構(gòu)如下:
核心原理:
-
門戶系統(tǒng)設(shè)置
Cookie
的domain
為一級(jí)域名也就是zlt.com
,這樣就可以共享門戶的Cookie
給所有的使用該域名(xxx.zlt.com
)的系統(tǒng) - 使用
Spring Session
等技術(shù)讓所有系統(tǒng)共享Session
- 這樣只要門戶系統(tǒng)登錄之后無論跳轉(zhuǎn)應(yīng)用1或者應(yīng)用2纵揍,都能通過門戶
Cookie
中的sessionId
讀取到Session
中的登錄信息實(shí)現(xiàn)單點(diǎn)登錄
?
2.2. 跨域單點(diǎn)登錄
單點(diǎn)登錄之間的系統(tǒng)域名不一樣顿乒,例如第三方系統(tǒng)。由于域名不一樣不能共享 Cookie
了泽谨,這樣就需要通過一個(gè)單獨(dú)的授權(quán)服務(wù)(UAA)來做統(tǒng)一登錄璧榄,并基于共享UAA的 Cookie
來實(shí)現(xiàn)單點(diǎn)登錄。
舉個(gè)例子:有兩個(gè)系統(tǒng)分別是:應(yīng)用1(webApp.com)和應(yīng)用2(zlt.com)需要實(shí)現(xiàn)單點(diǎn)登錄吧雹,另外有一個(gè)UAA授權(quán)中心(sso.com)骨杂,實(shí)現(xiàn)架構(gòu)如下:
核心原理:
- 訪問系統(tǒng)1判斷未登錄,則跳轉(zhuǎn)到UAA系統(tǒng)請(qǐng)求授權(quán)
- 在UAA系統(tǒng)域名
sso.com
下的登錄地址中輸入用戶名/密碼完成登錄 - 登錄成功后UAA系統(tǒng)把登錄信息保存到
Session
中雄卷,并在瀏覽器寫入域?yàn)?sso.com
的Cookie
- 訪問系統(tǒng)2判斷未登錄搓蚪,則跳轉(zhuǎn)到UAA系統(tǒng)請(qǐng)求授權(quán)
- 由于是跳轉(zhuǎn)到UAA系統(tǒng)的域名
sso.com
下,所以能通過瀏覽器中UAA的Cookie
讀取到Session
中之前的登錄信息完成單點(diǎn)登錄
?
2.3. 基于Oauth2的跨域單點(diǎn)登錄流程
關(guān)于Oauth2的授權(quán)碼模式這里就不做介紹了丁鹉,自行找資料了解
?
三妒潭、Spring Security實(shí)現(xiàn)
Oauth2單點(diǎn)登錄除了需要授權(quán)中心完成統(tǒng)一登錄/授權(quán)邏輯之外
基于
Spring Security
實(shí)現(xiàn)的UUA統(tǒng)一授權(quán)中心可以參考:https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-uaa
各個(gè)系統(tǒng)本身(sso客戶端)也需要實(shí)現(xiàn)以下邏輯:
- 攔截請(qǐng)求判斷登錄狀態(tài)
- 與
UAA授權(quán)中心
通過Oauth2授權(quán)碼模式
交互完成登錄/單點(diǎn)登錄 - 保存用戶登錄信息
以上邏輯只需使用一個(gè) @EnableOAuth2Sso
注解即可實(shí)現(xiàn)
SpringBoot配置如下:
下圖是訪問 sso客戶端
時(shí) @EnableOAuth2Sso
注解與 UAA授權(quán)中心
通過 Oauth2授權(quán)碼模式
交互完成單點(diǎn)登錄的步驟
請(qǐng)結(jié)合上面單點(diǎn)時(shí)序圖中單點(diǎn)登錄系統(tǒng)2的1~5步
PS:如果系統(tǒng)用的不是 Spring Security
怎么辦?理解原理自行實(shí)現(xiàn)
?
四揣钦、demo下載地址
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/sso-demo
?
掃碼關(guān)注有驚喜雳灾!