Sa-Token 基礎(chǔ)及 Spring Boot 集成實(shí)戰(zhàn)指南
一、Sa-Token 簡(jiǎn)介
Sa-Token 是一個(gè)輕量級(jí) Java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2.0、分布式 Session 會(huì)話等一系列與權(quán)限相關(guān)的問(wèn)題。相比于 Shiro 和 Spring Security,Sa-Token 具有以下特點(diǎn):
- 簡(jiǎn)單易用:API 設(shè)計(jì)直觀,學(xué)習(xí)成本低
- 功能全面:覆蓋大部分認(rèn)證授權(quán)場(chǎng)景
- 輕量高效:不依賴復(fù)雜設(shè)計(jì),性能優(yōu)異
- 模塊化設(shè)計(jì):可按需引入功能模塊
- 良好擴(kuò)展性:支持自定義各種組件
二、核心概念
1. 登錄認(rèn)證流程
用戶登錄 -> 生成Token -> 存儲(chǔ)Token -> 返回給客戶端 客戶端攜帶Token -> 服務(wù)器驗(yàn)證Token -> 訪問(wèn)受保護(hù)資源
2. 核心組件
- StpUtil:核心工具類,提供登錄、注銷、權(quán)限校驗(yàn)等操作
- SaTokenConfig:配置類,可自定義各種參數(shù)
- SaInterceptor:攔截器,實(shí)現(xiàn)路由攔截鑒權(quán)
- SaTokenDao:Token 持久層接口,默認(rèn)內(nèi)存實(shí)現(xiàn),可擴(kuò)展為 Redis
3. 主要功能
- 登錄認(rèn)證
- 權(quán)限認(rèn)證(角色/權(quán)限)
- Session 管理
- 踢人下線
- 多賬號(hào)體系
- 單點(diǎn)登錄
- 模擬他人賬號(hào)
- 臨時(shí)身份切換
三、Spring Boot 集成實(shí)戰(zhàn)
1. 添加依賴
<!-- Sa-Token 核心包 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
<!-- 如果使用Redis持久化 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis</artifactId>
<version>最新版本</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>2. 基礎(chǔ)配置
# application.yml sa-token: # token名稱 (同時(shí)也是cookie名稱) token-name: satoken # token有效期,單位s 默認(rèn)30天 timeout: 2592000 # token臨時(shí)有效期 (指定時(shí)間內(nèi)無(wú)操作就視為token過(guò)期) 單位: 秒 activity-timeout: -1 # 是否允許同一賬號(hào)并發(fā)登錄 (為true時(shí)允許一起登錄, 為false時(shí)新登錄擠掉舊登錄) is-concurrent: true # 在多人登錄同一賬號(hào)時(shí),是否共用一個(gè)token (為true時(shí)所有登錄共用一個(gè)token, 為false時(shí)每次登錄新建一個(gè)token) is-share: true # token風(fēng)格 token-style: uuid # 是否輸出操作日志 is-log: true
3. 登錄認(rèn)證實(shí)現(xiàn)
@RestController
@RequestMapping("/user/")
public class UserController {
@PostMapping("doLogin")
public SaResult doLogin(String username, String password) {
// 模擬數(shù)據(jù)庫(kù)校驗(yàn)
if("admin".equals(username) && "123456".equals(password)) {
// 登錄成功,生成Token
StpUtil.login(10001);
return SaResult.ok("登錄成功").setData(StpUtil.getTokenInfo());
}
return SaResult.error("登錄失敗");
}
// 查詢登錄狀態(tài)
@GetMapping("isLogin")
public SaResult isLogin() {
return SaResult.ok("是否登錄:" + StpUtil.isLogin());
}
// 退出登錄
@GetMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok();
}
}4. 權(quán)限認(rèn)證實(shí)現(xiàn)
@RestController
@RequestMapping("/admin/")
public class AdminController {
// 權(quán)限校驗(yàn):必須具有admin權(quán)限才能進(jìn)入
@SaCheckPermission("admin")
@GetMapping("menu")
public SaResult menu() {
return SaResult.data("管理員菜單");
}
// 角色校驗(yàn):必須具有super-admin角色才能進(jìn)入
@SaCheckRole("super-admin")
@GetMapping("settings")
public SaResult settings() {
return SaResult.data("系統(tǒng)設(shè)置");
}
// 二級(jí)認(rèn)證:必須輸入密碼進(jìn)行二次驗(yàn)證后才能進(jìn)入
@SaCheckSafe()
@GetMapping("criticalOperation")
public SaResult criticalOperation() {
return SaResult.data("關(guān)鍵操作");
}
}5. 全局?jǐn)r截器配置
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
// 注冊(cè)Sa-Token的注解攔截器,打開(kāi)注解式鑒權(quán)功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊(cè)注解攔截器
registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
}
}四、進(jìn)階功能
1. Redis 集成(分布式會(huì)話)
# application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
sa-token:
# 配置Token持久化到Redis
is-share: true
is-read-body: false
is-read-head: true
is-v: false
token-prefix: "satoken:"
jwt-secret-key: null
id-token-timeout: 86400
dao: "redis"2. 自定義會(huì)話管理
@Component
public class CustomSaTokenDao extends SaTokenDaoDefaultImpl {
// 重寫(xiě)數(shù)據(jù)訪問(wèn)層方法,例如使用MongoDB存儲(chǔ)
@Override
public String get(String key) {
// 自定義實(shí)現(xiàn)
return super.get(key);
}
@Override
public void set(String key, String value, long timeout) {
// 自定義實(shí)現(xiàn)
super.set(key, value, timeout);
}
}3. 注解鑒權(quán)
Sa-Token 提供豐富的注解用于權(quán)限控制:
@SaCheckLogin: 登錄校驗(yàn)@SaCheckRole("admin"): 角色校驗(yàn)@SaCheckPermission("user:add"): 權(quán)限校驗(yàn)@SaCheckSafe: 二級(jí)認(rèn)證校驗(yàn)@SaCheckBasic: HttpBasic校驗(yàn)
4. 路由攔截鑒權(quán)
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SaInterceptor(handler -> {
// 登錄校驗(yàn) -- 攔截所有路由
SaRouter.match("/**").check(r -> StpUtil.checkLogin());
// 角色校驗(yàn) -- 攔截以 admin 開(kāi)頭的路由
SaRouter.match("/admin/**").check(r -> StpUtil.checkRole("admin"));
// 權(quán)限校驗(yàn) -- 不同模塊校驗(yàn)不同權(quán)限
SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
SaRouter.match("/order/**", r -> StpUtil.checkPermission("order"));
})).addPathPatterns("/**");
}
}五、最佳實(shí)踐
Token 安全
- 使用 HTTPS
- 設(shè)置合理的 token 有效期
- 避免 token 在 URL 中傳輸
- 實(shí)現(xiàn) token 續(xù)期機(jī)制
權(quán)限設(shè)計(jì)
- 遵循最小權(quán)限原則
- 使用 RBAC (基于角色的訪問(wèn)控制) 模型
- 實(shí)現(xiàn)權(quán)限緩存機(jī)制
性能優(yōu)化
- 對(duì)于分布式系統(tǒng)使用 Redis 存儲(chǔ) token
- 合理設(shè)置 token 的過(guò)期時(shí)間
- 實(shí)現(xiàn)本地緩存減少持久層訪問(wèn)
監(jiān)控與日志
- 記錄關(guān)鍵認(rèn)證操作
- 監(jiān)控異常登錄行為
- 實(shí)現(xiàn)登錄設(shè)備管理
六、常見(jiàn)問(wèn)題解決方案
Token 失效問(wèn)題
- 檢查 token 過(guò)期時(shí)間設(shè)置
- 驗(yàn)證 token 持久化是否正常工作
- 檢查是否有并發(fā)登錄沖突
跨域問(wèn)題
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*") .exposedHeaders("satoken"); // 重點(diǎn)暴露satoken頭 } }自定義響應(yīng)格式
@RestControllerAdvice public class GlobalExceptionHandler { // 攔截所有未處理的SaToken異常 @ExceptionHandler(SaTokenException.class) public SaResult handlerSaTokenException(SaTokenException e) { return SaResult.error(e.getMessage()); } }多賬號(hào)體系
// 對(duì)于不同的賬號(hào)體系,可以使用不同的StpUtil StpUtil.stpLogic("user").login(10001); // 用戶體系登錄 StpUtil.stpLogic("admin").login(1); // 管理員體系登錄
七、總結(jié)
Sa-Token 作為一個(gè)輕量級(jí)的權(quán)限認(rèn)證框架,通過(guò)簡(jiǎn)單的 API 設(shè)計(jì)和豐富的功能,能夠滿足大多數(shù)應(yīng)用的認(rèn)證授權(quán)需求。與 Spring Boot 的集成非常簡(jiǎn)便,通過(guò)少量配置即可實(shí)現(xiàn)強(qiáng)大的權(quán)限控制功能。
相比傳統(tǒng)的 Shiro 和 Spring Security,Sa-Token 的學(xué)習(xí)曲線更為平緩,且針對(duì)常見(jiàn)場(chǎng)景提供了開(kāi)箱即用的解決方案。特別是對(duì)于中小型項(xiàng)目,Sa-Token 能夠顯著降低權(quán)限系統(tǒng)的開(kāi)發(fā)成本。
在實(shí)際項(xiàng)目中,建議根據(jù)業(yè)務(wù)需求選擇合適的持久化方案(內(nèi)存或 Redis),合理設(shè)計(jì)權(quán)限模型,并遵循安全最佳實(shí)踐,以構(gòu)建安全可靠的認(rèn)證授權(quán)系統(tǒng)。
到此這篇關(guān)于Sa-Token 基礎(chǔ)及 Spring Boot 集成實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Spring Boot 集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?使用?Sa-Token?完成權(quán)限認(rèn)證的操作方法
- SpringBoot權(quán)限認(rèn)證-Sa-Token的使用詳解
- springboot?整合?SA-Token?使用詳解
- Springboot 如何使用 SaToken 進(jìn)行登錄認(rèn)證、權(quán)限管理及路由規(guī)則接口攔截
- SpringBoot使用Sa-Token實(shí)現(xiàn)路徑攔截和特定接口放行
- SpringBoot整合Sa-Token實(shí)現(xiàn)?API?接口簽名安全校驗(yàn)功能
- Spring?Boot?集成并開(kāi)發(fā)?Sa-token示例詳解
- springboot 整合 sa-token簡(jiǎn)介及入門(mén)教程
- SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))
- SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證
- SpringBoot使用Sa-Token實(shí)現(xiàn)登錄認(rèn)證
相關(guān)文章
IDEA如何使用spring-Initializr快速搭建SpringBoot
這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中ReentrantLock和ReentrantReadWriteLock的原理
這篇文章主要介紹了Java中ReentrantLock和ReentrantReadWriteLock的原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
java實(shí)現(xiàn)XML與JSON轉(zhuǎn)換的便捷實(shí)用方法
這篇文章主要為大家介紹了java實(shí)現(xiàn)XML與JSON轉(zhuǎn)換的便捷實(shí)用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
SpringCloud Sleuth 分布式鏈路追蹤實(shí)踐指南
SpringCloud Sleuth是一個(gè)用于分布式追蹤的組件,通過(guò)為每個(gè)請(qǐng)求生成唯一的TraceID和SpanID,記錄請(qǐng)求在多個(gè)微服務(wù)中的流轉(zhuǎn)情況,本文重點(diǎn)給大家介紹SpringCloud Sleuth 分布式鏈路追蹤的實(shí)例講解,感興趣的朋友跟隨小編一起看看吧2025-11-11
springboot2.3 整合mybatis-plus 高級(jí)功能及用法詳解
這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
ssm實(shí)現(xiàn)分頁(yè)查詢的實(shí)例
下面小編就為大家?guī)?lái)一篇ssm實(shí)現(xiàn)分頁(yè)查詢的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11

