Sa-Token v1.43.0 發(fā)布 ??,新增 SSO 單設(shè)備注銷、消息推送,多 Access-Token 并存能力

Sa-Token 是一款 免費(fèi)開源 的輕量級(jí) Java 權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。??

sa-token-jss--white.png

目前最新版本 v1.43.0 已推送至 Maven 中央倉(cāng)庫(kù) ??,大家可以通過如下方式引入:

<!-- Sa-Token 權(quán)限認(rèn)證 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.43.0</version>
</dependency>

該版本包含大量 ????新增特性、??底層重構(gòu)、????代碼優(yōu)化 等,下面容我列舉幾條比較重要的更新內(nèi)容供大家參閱:

????? 更新點(diǎn)1:?jiǎn)吸c(diǎn)登錄模塊新增“單設(shè)備注銷”模式

有單點(diǎn)登錄就必然要有單點(diǎn)注銷,目前 SSO 單點(diǎn)登錄模塊包含:?jiǎn)螒?yīng)用注銷、單設(shè)備注銷、全端注銷 三種模式,怎么理解三者的差異呢?

舉個(gè)例子,用戶在 Chrome 瀏覽器 登錄了 應(yīng)用A、應(yīng)用B、應(yīng)用C,又在 Firefox 瀏覽器登錄了應(yīng)用A、應(yīng)用B,那么此時(shí)他:

  • 點(diǎn)擊“單應(yīng)用注銷”后:他只會(huì)在應(yīng)用A注銷下線,其它應(yīng)用依然會(huì)保持登錄狀態(tài)。
  • 點(diǎn)擊“單設(shè)備注銷”后:他在 Chrome 瀏覽器登錄的所有應(yīng)用會(huì)一起下線,但是 Firefox 瀏覽器登錄的應(yīng)用不受影響。
  • 點(diǎn)擊“全端注銷”后:用戶在所有瀏覽器登錄的所以會(huì)話一起注銷下線。

以上幾種注銷方式僅需通過一行代碼或者調(diào)用一個(gè)接口即可實(shí)現(xiàn),詳細(xì)可參考在線文檔:Sa-Token SSO 單點(diǎn)注銷

????? 更新點(diǎn)2:?jiǎn)吸c(diǎn)登錄模塊新增消息推送機(jī)制

此提案來源于社區(qū)交流群中的一位開發(fā)者咨詢:

sa-sso-message-push-tian.png

該開發(fā)者指出是否可以在 SSO 模塊增加各個(gè)系統(tǒng)互相通知 token 續(xù)期的功能,以便做到系統(tǒng)之間會(huì)話有效期的強(qiáng)同步。

本次更新沒有直接增加這兩個(gè) API,而是從底層構(gòu)建了一套消息推送體系,允許 sso-client 端按照特點(diǎn)格式構(gòu)建一個(gè) http 請(qǐng)求,調(diào)用 sso-server 端的 /sso/pushS 接口,sso-server 接收到消息后做出處理回應(yīng) sso-client 端。

消息推送是相互的,sso-server 端也可以構(gòu)建 http 請(qǐng)求,調(diào)用 sso-client 端的 /sso/pushC 接口。

消息推送機(jī)制是應(yīng)用與認(rèn)證中心相互溝通的橋梁,ticket 校驗(yàn)、單點(diǎn)注銷等行為都是依賴消息推送機(jī)制來實(shí)現(xiàn)的。

當(dāng)然你也可以通過自定義消息處理器的方式,來擴(kuò)展消息推送能力,這將非常有助于你完成一些應(yīng)用與認(rèn)證中心的自定義數(shù)據(jù)交互。

假設(shè)我們現(xiàn)在有如下需求:在 sso-client 獲取 sso-server 端指定賬號(hào) id 的昵稱、頭像等信息,即:用戶資料的拉取。

首先,我們需要在 sso-server 實(shí)現(xiàn)一個(gè)消息處理器:

@RestController
public class SsoServerController {

    // 配置SSO相關(guān)參數(shù) 
    @Autowired
    private void configSso(SaSsoServerTemplate ssoServerTemplate) {

        // 添加消息處理器:userinfo (獲取用戶資料) (用于為 client 端開放拉取數(shù)據(jù)的接口)
        ssoServerTemplate.messageHolder.addHandle("userinfo", (ssoTemplate, message) -> {
            System.out.println("收到消息:" + message);

            // 自定義返回結(jié)果(模擬)
            return SaResult.ok()
                    .set("id", message.get("loginId"))
                    .set("name", "LinXiaoLin")
                    .set("sex", "女")
                    .set("age", 18);
        });

    }

}

在 sso-client 端配置文件里要配置上消息推送的具體地址

# sa-token配置 
sa-token:
    # sso-client 相關(guān)配置
    sso-client:
        # 應(yīng)用標(biāo)識(shí)
        client: sso-client3
        # sso-server 端推送消息地址
        push-url: http://sa-sso-server.com:9000/sso/pushS
        # API 接口調(diào)用秘鑰
        secret-key: SSO-C3-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor

然后在需要拉取資料的地方:

// 查詢我的賬號(hào)信息:sso-client 前端 -> sso-center 后端 -> sso-server 后端
@RequestMapping("/sso/myInfo")
public Object myInfo() {
    // 如果尚未登錄
    if( ! StpUtil.isLogin()) {
        return "尚未登錄,無法獲取";
    }

    // 獲取本地 loginId
    Object loginId = StpUtil.getLoginId();

    // 構(gòu)建消息對(duì)象 
    SaSsoMessage message = new SaSsoMessage();
    message.setType("userinfo");
    message.set("loginId", loginId);
    
    // 推送至 sso-server,并接收響應(yīng)數(shù)據(jù) 
    SaResult result = SaSsoClientUtil.pushMessageAsSaResult(message);

    // 返回給前端
    return result;
}

詳細(xì)可參考在線文檔:Sa-Token SSO 消息推送機(jī)制 。

????? 更新點(diǎn)3:?jiǎn)吸c(diǎn)登錄新增 resdk 對(duì)接模式

Sa-Token SSO 模塊一直是支持非 Sa-Token 技術(shù)棧、甚至非 java 項(xiàng)目對(duì)接的,在之前版本給出的對(duì)接方式是 NoSdk 模式。

NoSdk 模式就是指不集成 Sa-Token,直接通過 http 工具類調(diào)用接口的方式來對(duì)接 SSO-Server。

參考 demo:sa-token-demo-sso3-client-nosdk

該 demo 假設(shè)應(yīng)用端沒有使用任何“權(quán)限認(rèn)證框架”,使用最基礎(chǔ)的 ServletAPI 進(jìn)行會(huì)話管理,模擬了 /sso/login、 /sso/logout、 /sso/logoutCall 三個(gè)接口的處理邏輯。

但是基于以下原因,NoSdk 示例將不再維護(hù):

  • 1、NoSdk demo 相當(dāng)于通過 http 工具類再次重寫了一遍 Sa-Token SSO 模塊代碼,繁瑣且冗余。
  • 2、重寫的代碼無法擁有 Sa-Token SSO 模塊全部能力,僅能完成基本對(duì)接,算是一個(gè)簡(jiǎn)化版 SDK。

最新版我們推薦使用 ReSdk 方式進(jìn)行對(duì)接:ReSdk 模式(重寫SDK部分方法):通過重寫框架關(guān)鍵步驟點(diǎn),來對(duì)接 SSO-Server。

參考 demo:sa-token-demo-sso3-client-resdk

ReSdk 模式優(yōu)點(diǎn):

1、依然支持客戶端使用任意技術(shù)棧。
2、僅重寫少量部分關(guān)鍵代碼,即可完成對(duì)接。幾乎可以得到 Sa-Token SSO 模塊全量能力。

????? 更新點(diǎn)4:OAuth2新增多 Access-Token 并存能力。

點(diǎn)擊非常高的一個(gè)提案:OAuth2 模塊每次生成新的 access_token 時(shí)能否保留舊 access_token 依然有效。

fix issues: #IBHFD1 、 #IBLL4Q 、#724

sa-many-access-token-issue1.png
sa-many-access-token-issue2.png
sa-many-access-token-issue3.png

在之前的版本中,因索引數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)所限,每次申請(qǐng) access_token 時(shí)會(huì)導(dǎo)致舊 access_token 立即失效,新版本重構(gòu)了索引數(shù)據(jù)結(jié)構(gòu),增加了多 Access-Token 并存能力。

相關(guān) API 展示:

// 獲取 AccessTokenModel,無效的 AccessToken 會(huì)返回 null
SaOAuth2Util.getAccessToken(accessToken);

// 校驗(yàn) Access-Token,成功返回 AccessTokenModel,失敗則拋出異常
SaOAuth2Util.checkAccessToken(accessToken);

// 獲取 Access-Token 列表:此應(yīng)用下 對(duì) 某個(gè)用戶 簽發(fā)的所有 Access-token
SaOAuth2Util.getAccessTokenValueList(clientId, loginId);

// 判斷:指定 Access-Token 是否具有指定 Scope 列表,返回 true 或 false
SaOAuth2Util.hasAccessTokenScope(accessToken, ...scopes);

// 校驗(yàn):指定 Access-Token 是否具有指定 Scope 列表,如果不具備則拋出異常
SaOAuth2Util.checkAccessTokenScope(accessToken, ...scopes);

// 獲取 Access-Token 所代表的LoginId
SaOAuth2Util.getLoginIdByAccessToken(accessToken);

// 獲取 Access-Token 所代表的 clientId
SaOAuth2Util.getClientIdByAccessToken(accessToken);

// 回收一個(gè) Access-Token
SaOAuth2Util.revokeAccessToken(accessToken);

// 回收全部 Access-Token:指定應(yīng)用下 指定用戶 的全部 Access-Token
SaOAuth2Util.revokeAccessTokenByIndex(clientId, loginId);

在線文檔相關(guān)章節(jié):Sa-Token-OAuth2 常用方法

????? 更新點(diǎn)5:簡(jiǎn)化 core 核心包功能模塊,進(jìn)行拆包

在社區(qū)群聊中有同學(xué)提到目前 sa-token-core 核心包功能過于擁擠復(fù)雜。應(yīng)要求本次將部分功能模塊進(jìn)行刪減,轉(zhuǎn)移到了 plugin 包下:

  • 拆分:API Key 模塊拆分獨(dú)立插件包:sa-token-apikey。
  • 拆分:API Sign 模塊拆分獨(dú)立插件包:sa-token-sign。

并且本次更新新增了以下插件包:

  • 新增:新增 sa-token-forest 插件,用于在 Http 請(qǐng)求處理器模塊整合 Forest。
  • 新增:新增 sa-token-okhttps 插件,用于在 Http 請(qǐng)求處理器模塊整合 OkHttps。

?? 完整更新日志

除了以上提到的幾點(diǎn)以外,還有更多更新點(diǎn)無法逐一詳細(xì)介紹,下面是 v1.43.0 版本的完整更新日志:

  • core:
    • 新增:SaLogoutParameter 新增 deviceId 參數(shù),用于控制指定設(shè)備 id 的注銷。 [重要]
    • 新增:新增 SaHttpTemplate 請(qǐng)求處理器模塊。
    • 新增:TOTP 增加 issuer 字段。 merge: pr 329
    • 修復(fù):修復(fù) Http Digest 認(rèn)證時(shí) url 上帶有查詢參數(shù)時(shí)認(rèn)證無法通過的問題。merge: pr 334
    • 新增:@SaCheckOr 注解添加 append 字段,用于抓取未預(yù)先定義的注解類型進(jìn)行批量注解鑒權(quán)。
    • 新增:偵聽器 doRenewTimeout 方法添加 loginType 參數(shù)。
    • 新增:SaInterceptor 新增 beforeAuth 認(rèn)證前置函數(shù)。
  • SSO:
    • 新增:?jiǎn)吸c(diǎn)注銷支持單設(shè)備注銷。 [重要] fix: #IA6ZK0#747
    • 新增:新增消息推送機(jī)制。 [重要] fix: #IBGXA7
    • 新增:配置項(xiàng) clients 用于單獨(dú)配置每個(gè) client 的授權(quán)信息。 [重要]
    • 新增:配置項(xiàng) allowAnonClient 決定是否啟用匿名 client。
    • 新增:SSO 模塊新增配置文件方式啟用“不同 client 不同秘鑰”能力。
    • 重構(gòu):sso-client 封裝化獲取 client 標(biāo)識(shí)值。
    • 新增:新增 SSO Strategy 策略類。
    • 新增:sso-client 新增 convertCenterIdToLoginId、convertLoginIdToCenterId 策略函數(shù),用于描述本地 LoginId 與認(rèn)證中心 loginId 的轉(zhuǎn)換規(guī)則。
    • 新增:sso-server 新增 jumpToRedirectUrlNotice 策略,用于授權(quán)重定向跳轉(zhuǎn)之前的通知。
    • 優(yōu)化:調(diào)整整體 SSO 示例代碼。
    • 新增:新增 ReSdk 模式對(duì)接示例:sa-token-demo-sso3-client-resdk。 [重要]
    • 新增:新增匿名應(yīng)用模式對(duì)接示例:sa-token-demo-sso3-client-anon[重要]
  • OAuth2:
    • 新增:SaClientModel 新增 isAutoConfirm 配置項(xiàng),用于決定是否允許應(yīng)用可以自動(dòng)確認(rèn)授權(quán)。 [重要]
    • 新增:多 Access-Token 并存、多 Refresh-Token 并存、多 Client-Token 并存能力。 [重要] fix: #IBHFD1 、 #IBLL4Q 、#724
    • 新增:Scope 分割符支持加號(hào)。merge: pr 333
    • 修復(fù):修復(fù) oidc 協(xié)議下,當(dāng)用戶數(shù)據(jù)變動(dòng)后,id_token 仍是舊信息的問題。
    • 優(yōu)化:對(duì) OAuth2 Password 認(rèn)證模式需要重寫處理器添加強(qiáng)提醒。
    • 優(yōu)化:將認(rèn)證流程回調(diào)從 SaOAuth2ServerConfig 轉(zhuǎn)移到 SaOAuth2Strategy。
    • 新增:新增 SaOAuth2Strategy.instance.userAuthorizeClientCheck 策略,用于檢查指定用戶是否可以授權(quán)指定應(yīng)用。fix: #553
    • 優(yōu)化:優(yōu)化調(diào)整 sa-token-oauth2 模塊代碼結(jié)構(gòu)及注釋。
    • 新增:currentAccessToken()、currentClientToken(),簡(jiǎn)化讀取 access_tokenclient_token 步驟
  • 插件:
    • 新增:新增 sa-token-forest 插件,用于在 Http 請(qǐng)求處理器模塊整合 Forest。
    • 新增:新增 sa-token-okhttps 插件,用于在 Http 請(qǐng)求處理器模塊整合 OkHttps。
    • 拆分:API Key 模塊拆分獨(dú)立插件包:sa-token-apikey。
    • 拆分:API Sign 模塊拆分獨(dú)立插件包:sa-token-sign。
    • 修復(fù):修復(fù) sa-token-dubbo 插件部分場(chǎng)景上下文控制出錯(cuò)的問題。
    • 修復(fù):修復(fù) sa-token-sanck3 SaSessionForSnack3Customized:getModel 接收 map 值時(shí)會(huì)出錯(cuò)的問題。 merge: pr 330
    • 修復(fù):修復(fù)使用 sa-token-redis-template-jdk-serializer 時(shí)反序列化錯(cuò)誤。merge: pr 331
    • 修復(fù):sa-token-snack3 優(yōu)化 objectToJson 序列化處理(增加類名,但不增加根類名)。
    • 重構(gòu):重構(gòu) sa-token-redis-templatesa-token-redis-template-jdk-serializer 插件中 update 方法 ttl 獲取方式改為毫秒,以減少 update 時(shí)的 ttl 計(jì)算誤差。 [重要]
  • 示例:
    • 新增:新增 SSE 鑒權(quán)示例。
  • 文檔:
    • 新增:新增文檔離線版下載。
    • 新增:新增框架功能列表插圖。
    • 新增:新增示例:如何在響應(yīng)式環(huán)境下的 Filter 里調(diào)用 Sa-Token 同步 API。
    • 新增:新增 QA:在 idea 導(dǎo)入源碼,運(yùn)行報(bào)錯(cuò):java: 程序包c(diǎn)n.dev33.satoken.oauth2不存在。
    • 新增:新增 QA:新增QA:報(bào)錯(cuò):SaTokenContext 上下文尚未初始化。
    • 新增:新增 QA:在 idea 導(dǎo)入源碼,運(yùn)行報(bào)錯(cuò):java: 程序包c(diǎn)n.dev33.satoken.oauth2不存在。
    • 新增:重寫路由匹配算法修正為最新寫法。
    • 新增:修復(fù) OAuth2 UnionId 章節(jié)相關(guān)不正確描述。
    • 優(yōu)化:完善 QA:訪問了一個(gè)不存在的路由,報(bào)錯(cuò):SaTokenContext 上下文尚未初始化。 fix: #771
    • 優(yōu)化:補(bǔ)充 sso 模塊遺漏的配置字段介紹。
    • 優(yōu)化:OAuth2-Server 示例添加真正表單。
    • 新增:文檔新增重寫 PasswordGrantTypeHandler 處理器示例。
    • 新增:sso 章節(jié)和 oauth2 章節(jié)文檔增加可重寫策略說明。
  • 其它:
    • 新增:readme 新增框架功能介紹圖。
    • 新增:SSO 模塊新增思維導(dǎo)圖說明。
    • 新增:readme 新增 Forest 的友情鏈接。

更新日志在線文檔直達(dá)鏈接:https://sa-token.cc/doc.html#/more/update-log

?? 其它

代碼倉(cāng)庫(kù)地址:https://gitee.com/dromara/sa-token

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容