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ù) :




?? 完整更新日志
除了以上提到的幾點(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 序列化模塊,控制
Object與String的序列化方式。 [重要] - 重構(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、isShare、maxLoginCount、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、isLogoutKeepFreezeOps、isLogoutKeepTokenSession配置項(xiàng)。
- 修復(fù):修復(fù)
- 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-testjson 模塊單元測(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)圖:
