SpringBoot權(quán)限認證-Sa-Token的使用詳解
本文詳細介紹了Sa-Token在Java項目中的使用方法,包括Sa-Token的基本概念、與其他權(quán)限框架的比較、基本語法和高級用法,并通過實例講解了如何在項目中集成和使用Sa-Token。作為一款輕量級Java權(quán)限認證框架,Sa-Token在簡化權(quán)限管理、提高開發(fā)效率方面發(fā)揮了重要作用。本文還將深入探討Sa-Token的核心原理,通過內(nèi)部代碼展示其工作機制。最后,總結(jié)了Sa-Token的優(yōu)缺點及其在實際開發(fā)中的應(yīng)用場景,為開發(fā)者提供全面的指導(dǎo)。
一、Sa-Token介紹
1. Sa-Token簡介
Sa-Token是一款輕量級Java權(quán)限認證框架,旨在解決Web系統(tǒng)中常見的登錄認證、權(quán)限驗證、Session會話、單點登錄等問題。其核心目標是以最簡潔的方式,實現(xiàn)強大的權(quán)限控制功能,幫助開發(fā)者快速完成權(quán)限系統(tǒng)的搭建。
Sa-Token具有如下優(yōu)勢:
| 優(yōu)勢 | 描述 |
|---|---|
| 簡單易用 | API設(shè)計簡潔明了,易于集成和使用,上手快,學(xué)習(xí)成本低。 |
| 功能豐富 | 支持多種權(quán)限控制需求,滿足復(fù)雜業(yè)務(wù)場景。支持登錄認證、權(quán)限驗證、角色驗證、Session會話、多賬號體系等功能。 |
| 高性能 | 輕量級設(shè)計,對系統(tǒng)性能影響小。 |
| 高度可擴展 | 提供豐富的擴展接口,與Spring、Spring Boot等常用框架高度兼容,支持自定義持久化、注解方式驗證、單點登錄等高級特性。 |
| 社區(qū)活躍 | 有良好的社區(qū)支持和文檔資源。 |
2. Sa-Token原理解析
Sa-Token的核心原理是通過Token機制實現(xiàn)用戶的身份認證和權(quán)限校驗。
其主要工作流程如下:
① 登錄認證:用戶登錄成功后,服務(wù)器生成一個全局唯一的Token,并將其返回給客戶端。
② Token存儲:Token與用戶身份信息的映射關(guān)系保存在服務(wù)器的會話中(如Redis、內(nèi)存等)。
③ 權(quán)限驗證:客戶端請求時攜帶Token,服務(wù)器根據(jù)Token獲取用戶信息,驗證其權(quán)限是否滿足要求。
④ 會話管理:支持Session會話管理,可以獲取和操作當(dāng)前會話的屬性。
流程圖例如下:

3. Sa-Token與其他權(quán)限框架比較
Sa-Token與其他常見權(quán)限框架在學(xué)習(xí)成本、集成難度上有顯著優(yōu)勢:
| 特性 | Sa-Token | Shiro | Spring Security |
|---|---|---|---|
| 學(xué)習(xí)成本 | 低 | 中 | 高 |
| 功能豐富度 | 高 | 中 | 高 |
| 集成難度 | 低 | 中 | 高 |
| 性能表現(xiàn) | 高 | 中 | 中 |
| 社區(qū)支持 | 活躍 | 一般 | 活躍 |
| 擴展性 | 高 | 中 | 高 |
二、Sa-Token的基本語法
在實際項目中,Sa-Token通過簡單的配置和API調(diào)用,即可實現(xiàn)完整的權(quán)限管理功能。以下將通過一個完整的Spring Boot示例,演示如何集成和使用Sa-Token。
1. 創(chuàng)建Spring Boot項目
首先,創(chuàng)建一個新的Spring Boot項目,可以使用IDEA的項目向?qū)Щ騍pring Initializr。
引入必要的依賴:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Sa-Token核心依賴 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
</dependencies>2. 配置Sa-Token
application.yml
# Sa-Token配置,可根據(jù)需要進行調(diào)整 sa-token: # token有效期,單位秒,默認30天 timeout: 2592000 # 是否打開二級登錄校驗 open-safe: false
3. 配置攔截器
創(chuàng)建配置類,添加Sa-Token的攔截器,以攔截請求并進行權(quán)限驗證。
SaTokenConfigure.java
import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊Sa-Token的注解攔截器,攔截所有路徑
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
}
}4. 登錄認證
創(chuàng)建登錄接口,實現(xiàn)用戶登錄功能。
LoginController.java
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;
@RestController
public class LoginController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 1. 校驗用戶名和密碼(這里模擬一個簡單的校驗)
if("admin".equals(username) && "123456".equals(password)) {
// 2. 登錄,保存用戶ID為10001
StpUtil.login(10001);
return "登錄成功,Token:" + StpUtil.getTokenValue();
}
return "用戶名或密碼錯誤";
}
}說明:
- 調(diào)用
StpUtil.login(10001)方法,實現(xiàn)登錄操作,參數(shù)為用戶的唯一標識ID。 - 登錄成功后,可以通過
StpUtil.getTokenValue()獲取當(dāng)前會話的Token。
5. 權(quán)限驗證
創(chuàng)建需要權(quán)限驗證的接口,例如獲取用戶信息的接口。
UserController.java
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
// 查詢用戶信息,需登錄
@GetMapping("/info")
public String getUserInfo() {
// 校驗是否登錄
StpUtil.checkLogin();
// 獲取用戶ID
int userId = StpUtil.getLoginIdAsInt();
return "當(dāng)前用戶信息,ID:" + userId;
}
// 修改用戶信息,需有權(quán)限"user:update"
@SaCheckPermission("user:update")
@PostMapping("/update")
public String updateUser() {
return "用戶信息更新成功";
}
}說明:
- 使用
StpUtil.checkLogin()方法手動校驗登錄狀態(tài)。 - 使用
@SaCheckPermission("user:update")注解,聲明該接口需要權(quán)限user:update。
6. 角色驗證
如果需要基于角色進行權(quán)限控制,可以使用@SaCheckRole注解。
import cn.dev33.satoken.annotation.SaCheckRole;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/admin")
public class AdminController {
// 僅管理員角色可訪問
@SaCheckRole("admin")
@GetMapping("/dashboard")
public String adminDashboard() {
return "歡迎進入管理員控制臺";
}
}7. 自定義權(quán)限驗證邏輯
需要自定義獲取用戶權(quán)限和角色的邏輯,可以實現(xiàn)StpInterface接口。
StpInterfaceImpl.java
import cn.dev33.satoken.stp.StpInterface;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class StpInterfaceImpl implements StpInterface {
// 返回一個用戶所擁有的權(quán)限碼集合
@Override
public List<String> getPermissionList(Object loginId, String loginKey) {
// 模擬從數(shù)據(jù)庫獲取權(quán)限
List<String> permissionList = new ArrayList<>();
if("10001".equals(loginId.toString())) {
permissionList.add("user:update");
permissionList.add("user:delete");
}
return permissionList;
}
// 返回一個用戶所擁有的角色標識集合 (權(quán)限與角色可分開校驗)
@Override
public List<String> getRoleList(Object loginId, String loginKey) {
// 模擬從數(shù)據(jù)庫獲取角色
List<String> roleList = new ArrayList<>();
if("10001".equals(loginId.toString())) {
roleList.add("admin");
}
return roleList;
}
}說明:
- 實現(xiàn)
getPermissionList方法,返回指定用戶的權(quán)限列表。 - 實現(xiàn)
getRoleList方法,返回指定用戶的角色列表。
8. 會話管理
Sa-Token提供了會話管理功能,可以在Session中存儲和獲取數(shù)據(jù)。
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
public void sessionDemo() {
// 獲取當(dāng)前會話的Session
SaSession session = StpUtil.getSession();
// 存儲數(shù)據(jù)
session.set("name", "張三");
session.set("email", "zhangsan@example.com");
// 獲取數(shù)據(jù)
String name = session.getString("name");
String email = session.getString("email");
// 輸出
System.out.println("姓名:" + name);
System.out.println("郵箱:" + email);
}9. 踢人下線
可以通過用戶ID強制用戶下線。
// 將用戶ID為10001的用戶踢下線
StpUtil.logoutByLoginId(10001);
// 檢查用戶是否已被踢下線
boolean isLogout = StpUtil.isLogin();
System.out.println("用戶是否登錄:" + isLogout);10. 注銷登錄
用戶主動注銷登錄,可以調(diào)用StpUtil.logout()方法。
// 注銷登錄
StpUtil.logout();
// 檢查登錄狀態(tài)
boolean isLogin = StpUtil.isLogin();
System.out.println("用戶是否登錄:" + isLogin);三、Sa-Token的高級用法
1. 自定義持久化
Sa-Token默認使用內(nèi)存來存儲Token信息,在分布式環(huán)境中,可以使用Redis作為持久化介質(zhì)。
引入Redis依賴:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis</artifactId>
<version>1.34.0</version>
</dependency>配置Redis持久化:
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoRedis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SaTokenDaoConfig {
@Bean
public SaTokenDao saTokenDao() {
// 返回Redis實現(xiàn)
return new SaTokenDaoRedis();
}
}配置Redis連接信息:
application.yml
# 配置Redis連接信息
spring:
redis:
host: localhost
port: 6379
password:2. 單點登錄(SSO)
Sa-Token提供了SSO模塊,可以快速實現(xiàn)單點登錄功能。
引入SSO依賴:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>1.34.0</version>
</dependency>配置SSO相關(guān)參數(shù):
application.yml
# SSO單點登錄配置
sa-token:
sso:
mode: client
server-url: http://sso-server.com
client-url: http://client1.com**實現(xiàn)SSO登錄邏輯:**
在客戶端應(yīng)用中,配置SSO的攔截器,自動處理單點登錄。
**SaTokenConfigure.java**
```java
import cn.dev33.satoken.sso.SaSsoHandle;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊SSO攔截器
registry.addInterceptor(new SaSsoHandle()).addPathPatterns("/**");
}
}3. OAuth2.0支持
Sa-Token也支持OAuth2.0協(xié)議,可以實現(xiàn)與第三方平臺的對接。
引入OAuth2.0依賴:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-oauth2</artifactId>
<version>1.34.0</version>
</dependency>配置OAuth2.0參數(shù)和實現(xiàn)授權(quán)流程(此處略,具體可參考官方文檔)。
4. 多賬號體系
如果系統(tǒng)中存在多種身份的用戶,例如普通用戶、管理員、商家等,可以使用多賬號體系進行區(qū)分。
登錄指定賬號體系:
// 管理員登錄,loginKey為"admin" StpUtil.login(10001, "admin");
檢查登錄狀態(tài):
// 檢查當(dāng)前賬號體系下是否登錄
boolean isLogin = StpUtil.isLogin("admin");權(quán)限驗證:
// 在指定賬號體系下進行權(quán)限驗證
StpUtil.checkPermission("user:update", "admin");四、Sa-Token使用總結(jié)
Sa-Token是一款輕量級的Java權(quán)限認證框架,因其簡單易用和功能豐富而備受開發(fā)者青睞。它以簡潔明了的API設(shè)計,使得集成和使用變得非常方便,開發(fā)者可以快速上手,降低了學(xué)習(xí)成本。Sa-Token支持多種權(quán)限控制需求,滿足復(fù)雜業(yè)務(wù)場景,包括登錄認證、權(quán)限驗證、角色驗證、Session會話、多賬號體系等功能,全面覆蓋了權(quán)限管理的各個方面。其輕量級的設(shè)計對系統(tǒng)性能影響小,適用于高并發(fā)的應(yīng)用環(huán)境。此外,Sa-Token提供了豐富的擴展接口,與Spring、Spring Boot等常用框架高度兼容,支持自定義持久化、注解方式驗證、單點登錄等高級特性,方便開發(fā)者根據(jù)項目需求進行定制開發(fā)?;钴S的社區(qū)支持和豐富的文檔資源也使得開發(fā)者能夠輕松獲取幫助和指導(dǎo)。
由于這些優(yōu)勢,Sa-Token非常適合中小型項目的快速開發(fā)和微服務(wù)架構(gòu)下的權(quán)限管理。當(dāng)項目需要快速搭建權(quán)限系統(tǒng)時,選擇Sa-Token是一個理想的方案。然而,在使用過程中需要注意Token的安全性,防止泄露帶來風(fēng)險;對于高并發(fā)場景,建議使用Redis等持久化介質(zhì)來提高系統(tǒng)性能和擴展性;同時,關(guān)注Sa-Token的版本更新,及時獲取新功能和安全補丁,以確保系統(tǒng)的安全性和穩(wěn)定性。
到此這篇關(guān)于SpringBoot權(quán)限認證-Sa-Token的使用詳解的文章就介紹到這了,更多相關(guān)SpringBoot權(quán)限認證Sa-Token內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java將Object轉(zhuǎn)換為數(shù)組的代碼
這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個別人寫的工具類,這個工具類,主要是判空操作,包括集合、數(shù)組、Map等對象是否為空的操作,需要的朋友可以參考下2022-09-09
微信小程序與AspNetCore SignalR聊天實例代碼
這篇文章主要介紹了微信小程序與AspNetCore SignalR聊天實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本)
這篇文章主要介紹了關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解
這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
SpringSecurity HttpSecurity 類處理流程分析
SpringSecurity在SSM項目中使用基于配置文件,通過XML標簽定義認證信息,HttpSecurity在SpringBoot中通過代碼配置實現(xiàn)與XML相同功能,詳細介紹了HttpSecurity的類結(jié)構(gòu)、處理過程及其與SecurityBuilder的關(guān)系,感興趣的朋友一起看看吧2024-09-09
SpringBoot中@Scheduled實現(xiàn)服務(wù)啟動時執(zhí)行一次
本文主要介紹了SpringBoot中@Scheduled實現(xiàn)服務(wù)啟動時執(zhí)行一次,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
maven中央倉庫修改驗證方式導(dǎo)致用戶名密碼失效的解決方式
這篇文章主要介紹了maven中央倉庫修改驗證方式導(dǎo)致用戶名密碼失效的解決方式,文中通過圖文結(jié)合的方式講解的非常詳細,對大家解決問題有一定的幫助2024-11-11

