Sa-Token 基礎(chǔ)及 Spring Boot 集成實(shí)戰(zhàn)指南
一、Sa-Token 簡介
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)的問題。相比于 Shiro 和 Spring Security,Sa-Token 具有以下特點(diǎn):
- 簡單易用:API 設(shè)計(jì)直觀,學(xué)習(xí)成本低
- 功能全面:覆蓋大部分認(rèn)證授權(quán)場景
- 輕量高效:不依賴復(fù)雜設(shè)計(jì),性能優(yōu)異
- 模塊化設(shè)計(jì):可按需引入功能模塊
- 良好擴(kuò)展性:支持自定義各種組件
二、核心概念
1. 登錄認(rèn)證流程
用戶登錄 -> 生成Token -> 存儲(chǔ)Token -> 返回給客戶端 客戶端攜帶Token -> 服務(wù)器驗(yàn)證Token -> 訪問受保護(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)無操作就視為token過期) 單位: 秒 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ù)庫校驗(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的注解攔截器,打開注解式鑒權(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 {
// 重寫數(shù)據(jù)訪問層方法,例如使用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 開頭的路由
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 (基于角色的訪問控制) 模型
- 實(shí)現(xiàn)權(quán)限緩存機(jī)制
性能優(yōu)化
- 對(duì)于分布式系統(tǒng)使用 Redis 存儲(chǔ) token
- 合理設(shè)置 token 的過期時(shí)間
- 實(shí)現(xiàn)本地緩存減少持久層訪問
監(jiān)控與日志
- 記錄關(guān)鍵認(rèn)證操作
- 監(jiān)控異常登錄行為
- 實(shí)現(xiàn)登錄設(shè)備管理
六、常見問題解決方案
Token 失效問題
- 檢查 token 過期時(shí)間設(shè)置
- 驗(yàn)證 token 持久化是否正常工作
- 檢查是否有并發(fā)登錄沖突
跨域問題
@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)證框架,通過簡單的 API 設(shè)計(jì)和豐富的功能,能夠滿足大多數(shù)應(yīng)用的認(rèn)證授權(quán)需求。與 Spring Boot 的集成非常簡便,通過少量配置即可實(shí)現(xiàn)強(qiáng)大的權(quán)限控制功能。
相比傳統(tǒng)的 Shiro 和 Spring Security,Sa-Token 的學(xué)習(xí)曲線更為平緩,且針對(duì)常見場景提供了開箱即用的解決方案。特別是對(duì)于中小型項(xiàng)目,Sa-Token 能夠顯著降低權(quán)限系統(tǒng)的開發(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權(quán)限認(rèn)證Sa-Token的使用總結(jié)
- 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?集成并開發(fā)?Sa-token示例詳解
- springboot 整合 sa-token簡介及入門教程
- 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)文章
java鏈?zhǔn)絼?chuàng)建json對(duì)象的實(shí)現(xiàn)
本文主要介紹了java中如何通過最簡單的方式實(shí)現(xiàn)鏈?zhǔn)絼?chuàng)建json對(duì)象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
如何實(shí)現(xiàn)自定義SpringBoot的Starter組件
這篇文章主要介紹了實(shí)現(xiàn)自定義SpringBoot的Starter組件的示例代碼,想要自定義starter組件,首先要了解springboot是如何加載starter的,也就是springboot的自動(dòng)裝配機(jī)制原理,本文結(jié)合示例代碼詳細(xì)講解,需要的朋友可以參考下2023-02-02
在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)
Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(即.sql后綴的數(shù)據(jù)庫)的相關(guān)資料,需要的朋友可以參考下2023-04-04
SpringBoot使用WebSocket實(shí)現(xiàn)向前端推送消息功能
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議,它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動(dòng)發(fā)送信息給客戶端,本文給大家介紹了SpringBoot使用WebSocket實(shí)現(xiàn)向前端推送消息功能,需要的朋友可以參考下2024-05-05
IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn)
這篇文章主要介紹了IntelliJ IDEA 統(tǒng)一設(shè)置編碼為utf-8編碼的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2020-06-06
MyBatis映射文件中的動(dòng)態(tài)SQL實(shí)例詳解
在本文中,我們深入探討了動(dòng)態(tài)SQL的各種標(biāo)簽,包括<if>、<choose>、<trim>、<foreach>等,通過實(shí)際的例子演示了它們的用法,感興趣的朋友一起揭開動(dòng)態(tài)SQL的神秘面紗,帶你領(lǐng)略它的魅力2024-01-01
Java BufferedReader相關(guān)源碼實(shí)例分析
這篇文章主要介紹了Java BufferedReader相關(guān)源碼實(shí)例分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

