一個(gè)注解搞定Spring Security基于Oauth2的SSO單點(diǎn)登錄功能

一、說(shuō)明
單點(diǎn)登錄顧名思義就是在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次,就可以訪問(wèn)其他相互信任的應(yīng)用系統(tǒng),免除多次登錄的煩惱。本文主要介紹 同域 和 跨域 兩種不同場(chǎng)景單點(diǎn)登錄的實(shí)現(xiàn)原理,并使用 Spring Security 來(lái)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的跨域 SSO客戶端 。
二、原理說(shuō)明
單點(diǎn)登錄主流都是基于共享 cookie 來(lái)實(shí)現(xiàn)的,下面分別介紹 同域 和 跨域 下的兩種場(chǎng)景具體怎樣實(shí)現(xiàn)共享 cookie 的
2.1. 同域單點(diǎn)登錄
適用場(chǎng)景:都是企業(yè)自己的系統(tǒng),所有系統(tǒng)都使用同一個(gè)一級(jí)域名通過(guò)不同的二級(jí)域名來(lái)區(qū)分。
舉個(gè)例子:公司有一個(gè)一級(jí)域名為 zlt.com ,我們有三個(gè)系統(tǒng)分別是:門(mén)戶系統(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)如下:

核心原理:
- 門(mén)戶系統(tǒng)設(shè)置
Cookie的domain為一級(jí)域名也就是zlt.com,這樣就可以共享門(mén)戶的Cookie給所有的使用該域名(xxx.zlt.com)的系統(tǒng) - 使用
Spring Session等技術(shù)讓所有系統(tǒng)共享Session - 這樣只要門(mén)戶系統(tǒng)登錄之后無(wú)論跳轉(zhuǎn)應(yīng)用1或者應(yīng)用2,都能通過(guò)門(mén)戶
Cookie中的sessionId讀取到Session中的登錄信息實(shí)現(xiàn)單點(diǎn)登錄
2.2. 跨域單點(diǎn)登錄
單點(diǎn)登錄之間的系統(tǒng)域名不一樣,例如第三方系統(tǒng)。由于域名不一樣不能共享 Cookie 了,這樣就需要通過(guò)一個(gè)單獨(dú)的授權(quán)服務(wù)(UAA)來(lái)做統(tǒng)一登錄,并基于共享UAA的 Cookie 來(lái)實(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)如下:

核心原理:
- 訪問(wèn)系統(tǒng)1判斷未登錄,則跳轉(zhuǎn)到UAA系統(tǒng)請(qǐng)求授權(quán)
- 在UAA系統(tǒng)域名
sso.com下的登錄地址中輸入用戶名/密碼完成 - 登錄登錄成功后UAA系統(tǒng)把登錄信息保存到
Session中,并在瀏覽器寫(xiě)入域?yàn)?sso.com的Cookie - 訪問(wèn)系統(tǒng)2判斷未登錄,則跳轉(zhuǎn)到UAA系統(tǒng)請(qǐng)求授權(quán)
- 由于是跳轉(zhuǎn)到UAA系統(tǒng)的域名
sso.com下,所以能通過(guò)瀏覽器中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)中心通過(guò)Oauth2授權(quán)碼模式交互完成登錄/單點(diǎn)登錄 - 保存用戶登錄信息
以上邏輯只需使用一個(gè) @EnableOAuth2Sso 注解即可實(shí)現(xiàn)

SpringBoot配置如下:

下圖是訪問(wèn) sso客戶端 時(shí) @EnableOAuth2Sso 注解與 UAA授權(quán)中心 通過(guò) 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)于一個(gè)注解搞定Spring Security基于Oauth2的SSO單點(diǎn)登錄功能的文章就介紹到這了,更多相關(guān)Spring Security 單點(diǎn)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析SpringBoot2.4 靜態(tài)資源加載問(wèn)題
這篇文章主要介紹了SpringBoot2.4 靜態(tài)資源加載問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Spring MVC傳遞接收參數(shù)方式小結(jié)
大家在開(kāi)發(fā)中經(jīng)常會(huì)用到Spring MVC Controller來(lái)接收請(qǐng)求參數(shù),主要常用的接收方式就是通過(guò)實(shí)體對(duì)象以及形參等方式、有些用于GET請(qǐng)求,有些用于POST請(qǐng)求,有些用于兩者,下面介紹幾種常見(jiàn)的Spring MVC傳遞接收參數(shù)的方式2021-11-11
Java中equals()知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于Java中equals()知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-03-03
java數(shù)據(jù)類(lèi)型轉(zhuǎn)換陷阱包括列表陷阱
這篇文章主要介紹了java數(shù)據(jù)類(lèi)型轉(zhuǎn)換的一些陷阱,包括基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換列表陷阱,基本上這一篇就把常見(jiàn)的問(wèn)題就給大家分享一下2020-10-10
Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法
在Java中生成隨機(jī)數(shù)的場(chǎng)景有很多,下面這篇文章主要給大家介紹了關(guān)于Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
初識(shí)sa-token及登錄授權(quán)簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家介紹了sa-token及登錄授權(quán)簡(jiǎn)單實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java中Calendar日歷類(lèi)型常見(jiàn)方法詳解
Calendar是Java中常用的時(shí)間處理工具之一,它提供了很多日歷類(lèi)型常見(jiàn)方法,下面是一些常用的方法及對(duì)應(yīng)的代碼和運(yùn)行結(jié)果,感興趣的朋友一起看看吧2023-11-11

