Sa-Token v1.41.0 發(fā)布 ??,來(lái)看看有沒(méi)有令你心動(dòng)的功能!

Sa-Token 是一個(gè)輕量級(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)問(wèn)題。??

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

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

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

??? 更新點(diǎn)1:防火墻模塊新增 hooks 擴(kuò)展機(jī)制

本次更新針對(duì)防火墻新增了多條校驗(yàn)規(guī)則,之前的規(guī)則為:

  • path 白名單放行。
  • path 黑名單攔截。
  • path 危險(xiǎn)字符校驗(yàn)。

本次新增規(guī)則為:

  • path 禁止字符校驗(yàn)。
  • path 目錄遍歷符檢測(cè)(優(yōu)化了檢測(cè)算法)。
  • 請(qǐng)求 host 檢測(cè)。
  • 請(qǐng)求 Method 檢測(cè)。
  • 請(qǐng)求 Header 頭檢測(cè)。
  • 請(qǐng)求參數(shù)檢測(cè)。

并且本次更新開(kāi)放了 hooks 機(jī)制,允許開(kāi)發(fā)者注冊(cè)自定義的校驗(yàn)規(guī)則 ???,參考如下:

@PostConstruct
public void saTokenPostConstruct() {
    // 注冊(cè)新 hook 演示,攔截所有帶有 pwd 參數(shù)的請(qǐng)求,拒絕響應(yīng) 
    SaFirewallStrategy.instance.registerHook((req, res, extArg)->{
        if(req.getParam("pwd") != null) {
            throw new FirewallCheckException("請(qǐng)求中不可包含 pwd 參數(shù)");
        }
    });
}

文檔直達(dá)地址:Sa-Token 防火墻 ??

?? 更新點(diǎn)2:新增基于 SPI 機(jī)制的插件體系

之前在 Sa-Token 中也有插件體系,不過(guò)都是利用 SpringBoot 的 SPI 機(jī)制完成組件注冊(cè)的。

這種注冊(cè)機(jī)制有一個(gè)問(wèn)題,就是插件只能在 SpringBoot 環(huán)境下正常工作,在其它環(huán)境,比如 Solon 項(xiàng)目中,就只能手動(dòng)注冊(cè)插件才行 ??。

也就是說(shuō),嚴(yán)格來(lái)講,這些插件只能算是 SpringBoot 的插件,而非 Sa-Token 框架的插件 ??。

為了提高插件的通用性,Sa-Token 設(shè)計(jì)了自己的 SPI 機(jī)制,使得這些插件可以在更多的項(xiàng)目環(huán)境下正常工作 ??。

第一步:實(shí)現(xiàn)插件注冊(cè)類(lèi),此類(lèi)需要 implements SaTokenPlugin 接口 ????:

/**
 * SaToken 插件安裝:插件作用描述
 */
public class SaTokenPluginForXxx implements SaTokenPlugin {
    @Override
    public void install() {
        // 書(shū)寫(xiě)需要在項(xiàng)目啟動(dòng)時(shí)執(zhí)行的代碼,例如:
        // SaManager.setXxx(new SaXxxForXxx());
    }
}

第二步:在項(xiàng)目的 resources\META-INF\satoken\ 文件夾下 ?? 創(chuàng)建 cn.dev33.satoken.plugin.SaTokenPlugin 文件,內(nèi)容為該插件注冊(cè)類(lèi)的完全限定名:

cn.dev33.satoken.plugin.SaTokenPluginForXxx

這樣便可以在項(xiàng)目啟動(dòng)時(shí),被 Sa-Token 插件管理器加載到此插件,執(zhí)行插件注冊(cè)類(lèi)的 install 方法,完成插件安裝 ?。

文檔直達(dá)地址:Sa-Token 插件開(kāi)發(fā)指南 ??

??? 更新點(diǎn)3:重構(gòu)緩存體系,將數(shù)據(jù)讀寫(xiě)與序列化操作分離

在之前的版本中,Redis 集成通常和具體的序列化方式耦合在一起,這不僅讓 Redis 相關(guān)插件產(chǎn)生大量的重復(fù)冗余代碼,也讓大家在選擇 Redis 插件時(shí)嚴(yán)重受限。??

本次版本更新徹底重構(gòu)了此模塊,將數(shù)據(jù)讀寫(xiě)與序列化操作分離,使其每一塊都可以單獨(dú)自定義實(shí)現(xiàn)類(lèi),做到靈活擴(kuò)展 ?,例如:

  • 1?? SaTokenDao 數(shù)據(jù)讀寫(xiě)可以選擇:RedisTemplate、Redisson、ConcurrentHashMap、Hutool-Timed-Cache 等不同實(shí)現(xiàn)類(lèi)。
  • 2?? SaSerializerTemplate 序列化器可以選擇:Base64編碼、Hex編碼、ISO-8859-1編碼、JSON序列化等不同方式。
  • 3?? JSON 序列化可以選擇:Jackson、Fastjson、Snack3 等組件。

所有實(shí)現(xiàn)類(lèi)均可以按需選擇,自由搭配,大大提高靈活性???。

??? 更新點(diǎn)4:SaLoginParameter 登錄參數(shù)類(lèi)新增大量配置項(xiàng)

SaLoginParameter (前SaLoginModel) 用于控制登錄操作中的部分細(xì)節(jié)行為,本次新增的配置項(xiàng)有:

  • isConcurrent:決定是否允許同一賬號(hào)多地同時(shí)登錄(為 true 時(shí)允許一起登錄, 為 false 時(shí)新登錄擠掉舊登錄)。??
  • isShare:在多人登錄同一賬號(hào)時(shí),是否共用一個(gè) token (為 true 時(shí)所有登錄共用一個(gè) token, 為 false 時(shí)每次登錄新建一個(gè) token)。??
  • maxLoginCount:同一賬號(hào)最大登錄數(shù)量,超出此數(shù)量的客戶端將被自動(dòng)注銷(xiāo),-1代表不限制數(shù)量。??
  • maxTryTimes:在創(chuàng)建 token 時(shí)的最高循環(huán)次數(shù),用于保證 token 唯一性(-1=不循環(huán)嘗試,直接使用。?
  • deviceId:此次登錄的客戶端設(shè)備id,用于判斷后續(xù)某次登錄是否為可信任設(shè)備。??
  • terminalExtraData:本次登錄掛載到 SaTerminalInfo 的自定義擴(kuò)展數(shù)據(jù)。??

以上大部分配置項(xiàng)在之前的版本中也有支持,不過(guò)它們都被定義在了全局配置類(lèi) SaTokenConfig 之上,本次更新支持在 SaLoginParameter 中定義這些配置項(xiàng),
這將讓登錄策略的控制變得更加靈活。?

?? 更新點(diǎn)5:新增 SaLogoutParameter 注銷(xiāo)參數(shù)類(lèi)

SaLogoutParameter 用于控制注銷(xiāo)操作中的部分細(xì)節(jié)行為?,例如:

通過(guò) Range 參數(shù)決定注銷(xiāo)范圍 ??:

// 注銷(xiāo)范圍: TOKEN=只注銷(xiāo)當(dāng)前 token 的會(huì)話,ACCOUNT=注銷(xiāo)當(dāng)前 token 指向的 loginId 其所有客戶端會(huì)話
StpUtil.logout(new SaLogoutParameter().setRange(SaLogoutRange.TOKEN));

通過(guò) DeviceType 參數(shù)決定哪些登錄設(shè)備類(lèi)型參與注銷(xiāo) ??:

// 指定 10001 賬號(hào),所有 PC 端注銷(xiāo)下線,其它端如 APP 端不受影響 
StpUtil.logout(10001, new SaLogoutParameter().setDeviceType("PC"));

還有其它參數(shù)此處暫不逐一列舉,文檔直達(dá)地址:Sa-Token 登錄參數(shù) & 注銷(xiāo)參數(shù) ??

?? 更新點(diǎn)6:修復(fù) StpUtil.setTokenValue("xxx")、loginParameter.getIsWriteHeader() 空指針的問(wèn)題。

這個(gè)沒(méi)啥好說(shuō)的,有 bug ?? 必須修復(fù)。

fix issue:#IBKSM0 ??

? 更新點(diǎn)7:API 參數(shù)簽名模塊升級(jí)

  • 1、新增了 @SaCheckSign 注解,現(xiàn)在 API 參數(shù)簽名模塊也支持注解鑒權(quán)了。??
  • 2、新增自定義簽名的摘要算法,現(xiàn)在不僅可以 md5 算法計(jì)算簽名,也支持 sha1、sha256 等算法了。??
  • 3、新增多應(yīng)用模式:

多應(yīng)用模式就是指,允許在對(duì)接多個(gè)系統(tǒng)時(shí)分別使用不同的秘鑰等配置項(xiàng),配置示例如下 ??:

sa-token: 
    # API 簽名配置 多應(yīng)用模式
    sign-many:
        # 應(yīng)用1
        xm-shop:
            secret-key: 0123456789abcdefg
            digest-algo: md5
        # 應(yīng)用2
        xm-forum:
            secret-key: 0123456789hijklmnopq
            digest-algo: sha256
        # 應(yīng)用3
        xm-video:
            secret-key: 12341234aaaaccccdddd
            digest-algo: sha512

然后在簽名時(shí)通過(guò)指定 appid 的方式獲取對(duì)應(yīng)的 SignTemplate 進(jìn)行操作 ????:

// 創(chuàng)建簽名示例
String paramStr = SaSignMany.getSignTemplate("xm-shop").addSignParamsAndJoin(paramMap);

// 校驗(yàn)簽名示例
SaSignMany.getSignTemplate("xm-shop").checkRequest(SaHolder.getRequest());

? 更新點(diǎn)8:新增 sa-token-caffeine 插件,用于整合 Caffeine

Caffeine 是一個(gè)基于 Java 的高性能本地緩存庫(kù),本次新增 sa-token-caffeine 插件用于將 Caffeine 作為 Sa-Token 的緩存層,存儲(chǔ)會(huì)話鑒權(quán)數(shù)據(jù)。??
這進(jìn)一步豐富了 Sa-Token 的緩存層插件生態(tài)。??

<!-- Sa-Token 整合 Caffeine -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-caffeine</artifactId>
    <version>1.41.0</version>
</dependency>

?? 更新點(diǎn)9:新增 sa-token-serializer-features 序列化擴(kuò)展包

引入此插件可以為 Sa-Token 提供一些有意思的序列化方案。(娛樂(lè)向,不建議上生產(chǎn) ??)

例如:以base64 編碼,采用:元素周期表 ??、特殊符號(hào) ??、或 emoji ?? 作為元字符集存儲(chǔ)數(shù)據(jù) :

sa-custom-serializer-emoji.png
sa-custom-serializer-emoji2.png
sa-custom-serializer-tsfh.png
sa-custom-serializer-yszqb.png

?? 完整更新日志

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

  • core:
    • 修復(fù):修復(fù) StpUtil.setTokenValue("xxx")loginParameter.getIsWriteHeader() 空指針的問(wèn)題。 fix: #IBKSM0
    • 修復(fù):將 SaDisableWrapperInfo.createNotDisabled() 默認(rèn)返回值封禁等級(jí)改為 -2,以保證向之前版本兼容。
    • 新增:新增基于 SPI 的插件體系。 [重要]
    • 重構(gòu):JSON 轉(zhuǎn)換器模塊。 [重要]
    • 新增:新增 serializer 序列化模塊,控制 ObjectString 的序列化方式。 [重要]
    • 重構(gòu):重構(gòu)防火墻模塊,增加 hooks 機(jī)制。 [重要]
    • 新增:防火墻新增:請(qǐng)求 path 禁止字符校驗(yàn)、Host 檢測(cè)、請(qǐng)求 Method 檢測(cè)、請(qǐng)求頭檢測(cè)、請(qǐng)求參數(shù)檢測(cè)。重構(gòu)目錄遍歷符檢測(cè)算法。
    • 重構(gòu):重構(gòu) SaTokenDao 模塊,將序列化與存儲(chǔ)操作分離。 [重要]
    • 重構(gòu):重構(gòu) SaTokenDao 默認(rèn)實(shí)現(xiàn)類(lèi),優(yōu)化底層設(shè)計(jì)。
    • 新增:isLastingCookie 配置項(xiàng)支持在全局配置中定義了。
    • 重構(gòu):SaLoginModel -> SaLoginParameter。 [不向下兼容]
    • 重構(gòu):TokenSign -> SaTerminalInfo。 [不向下兼容]
    • 新增:SaTerminalInfo 新增 extraData 自定義擴(kuò)展數(shù)據(jù)設(shè)置。
    • 新增:SaLoginParameter 支持配置 isConcurrent、isSharemaxLoginCount、maxTryTimes。
    • 新增:新增 SaLogoutParameter,用于控制注銷(xiāo)會(huì)話時(shí)的各種細(xì)節(jié)。 [重要]
    • 新增:新增 StpLogic#isTrustDeviceId 方法,用于判斷指定設(shè)備是否為可信任設(shè)備。
    • 新增:新增 StpUtil.getTerminalListByLoginId(loginId)、StpUtil.forEachTerminalList(loginId) 方法,以更方便的實(shí)現(xiàn)單賬號(hào)會(huì)話管理。
    • 升級(jí):API 參數(shù)簽名配置支持自定義摘要算法。
    • 新增:新增 @SaCheckSign 注解鑒權(quán),用于 API 簽名參數(shù)校驗(yàn)。
    • 新增:API 參數(shù)簽名模塊新增多應(yīng)用模式。 fix: #IAK2BI, #I9SPI1, #IAC0P9 [重要]
    • 重構(gòu):全局配置 is-share 默認(rèn)值改為 false。 [不向下兼容]
    • 重構(gòu):踢人下線、頂人下線默認(rèn)將刪除對(duì)應(yīng)的 token-session 對(duì)象。
    • 優(yōu)化:優(yōu)化注銷(xiāo)會(huì)話相關(guān) API。
    • 重構(gòu):登錄默認(rèn)設(shè)備類(lèi)型值改為 DEF。 [不向下兼容]
    • 重構(gòu):BCrypt 標(biāo)注為 @Deprecated
    • 新增:sa-token-quick-login 支持 SpringBoot3 項(xiàng)目。 fix: #IAFQNE#673
    • 新增:SaTokenConfig 新增 replacedRange、overflowLogoutMode、logoutRange、isLogoutKeepFreezeOpsisLogoutKeepTokenSession 配置項(xiàng)。
  • OAuth2:
    • 重構(gòu):重構(gòu) sa-token-oauth2 插件,使注解鑒權(quán)處理器的注冊(cè)過(guò)程改為 SPI 插件加載。
  • 插件:
    • 新增:sa-token-serializer-features 插件,用于實(shí)現(xiàn)各種形式的自定義字符集序列化方案。
    • 新增:sa-token-fastjson 插件。
    • 新增:sa-token-fastjson2 插件。
    • 新增:sa-token-snack3 插件。
    • 新增:sa-token-caffeine 插件。
  • 單元測(cè)試:
    • 新增:sa-token-json-test json 模塊單元測(cè)試。
    • 新增:sa-token-serializer-test 序列化模塊單元測(cè)試。
  • 文檔:
    • 新增:QA “多個(gè)項(xiàng)目共用同一個(gè) redis,怎么防止沖突?”
    • 優(yōu)化:補(bǔ)全 OAuth2 模塊遺漏的相關(guān)配置項(xiàng)。
    • 優(yōu)化:優(yōu)化 OAuth2 簡(jiǎn)述章節(jié)描述文檔。
    • 優(yōu)化:完善 “SSO 用戶數(shù)據(jù)同步 / 遷移” 章節(jié)文檔。
    • 修正:補(bǔ)全項(xiàng)目目錄結(jié)構(gòu)介紹文檔。
    • 新增:文檔新增 “登錄參數(shù) & 注銷(xiāo)參數(shù)” 章節(jié)。
    • 優(yōu)化:優(yōu)化“技術(shù)求助”按鈕的提示文字。
    • 新增:新增 preview-doc.bat 文件,一鍵啟動(dòng)文檔預(yù)覽。
    • 完善:完善 Redis 集成文檔。
    • 新增:新增單賬號(hào)會(huì)話查詢的操作示例。
    • 新增:新增頂人下線 API 介紹。
    • 新增:新增 自定義序列化插件 章節(jié)。
  • 其它:
    • 新增:新增 sa-token-demo/pom.xml 以便在 idea 中一鍵導(dǎo)入所有 demo 項(xiàng)目。
    • 刪除:刪除不必要的 .gitignore 文件
    • 重構(gòu):重構(gòu) sa-token-solon-plugin 插件。
    • 新增:新增設(shè)備鎖登錄示例。

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

?? 其它

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

框架功能結(jié)構(gòu)圖:

sa-token-js4.png
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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