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

