Spring Boot整合SA-Token的使用详解,涉及到SA-Token的基本介绍、整合步骤、配置、常用API以及实际使用场景等多个方面。以下将详细阐述这一过程,确保内容不少于2000字。
一、SA-Token简介
SA-Token是一个轻量级的Java权限认证框架,由国人开发,主要解决登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题。SA-Token以简单、优雅的方式完成系统的权限认证部分,让开发者能够专注于业务逻辑的开发,而无需过多关注权限控制的实现细节。
二、Spring Boot整合SA-Token的步骤
1. 引入SA-Token依赖
首先,你需要在Spring Boot项目的pom.xml
文件中引入SA-Token的依赖。如果你使用的是Spring Boot 3.x版本,则需要引入sa-token-spring-boot3-starter
;对于Spring Boot 2.x版本,则引入sa-token-spring-boot-starter
。以Spring Boot 3.x为例,依赖配置如下:
xml
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>最新版本号</version> <!-- 请替换为最新的版本号 -->
</dependency>
注意:在编写本文时,SA-Token的最新版本可能已经更新,请访问SA-Token的官方GitHub仓库或SA-Token的官方网站获取最新的版本号。
2. 配置SA-Token
SA-Token的配置可以在application.yml
或application.properties
文件中进行。以下是一个application.yml
的配置示例:
yaml
sa-token:
token-name: satoken # token名称(同时也是cookie名称)
timeout: 2592000 # token有效期(单位:秒), 默认30天, -1代表永久有效
active-timeout: 7200 # token临时有效期(单位:秒), 指定时间内无操作就视为token过期
is-concurrent: true # 是否允许同一账号多地同时登录
is-share: true # 在多人登录同一账号时, 是否共用一个token
token-style: uuid # token风格
is-log: false # 是否输出操作日志
# 其他配置...
3. 编写登录认证逻辑
在Spring Boot项目中,你通常需要编写登录接口来处理用户的登录请求。SA-Token提供了StpUtil.login(Object id)
方法来标记当前会话登录的账号ID。以下是一个简单的登录接口示例:
java
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/login")
public SaResult login(@RequestParam String username, @RequestParam String password) {
// 假设这里通过数据库查询用户信息并验证密码
// ...
// 验证成功后,使用StpUtil.login(Object id)标记当前会话登录
StpUtil.login(userId); // userId为验证成功后的用户ID
return SaResult.ok("登录成功");
}
}
注意:在实际项目中,你需要根据业务逻辑从数据库中查询用户信息并验证密码。上述代码中的userId
是一个假设的变量,代表验证成功后的用户ID。
4. 权限认证
SA-Token提供了丰富的API来进行权限认证。首先,你需要实现StpInterface
接口来定义如何获取一个账号所拥有的权限码集合和角色标识集合。然后,你可以使用StpUtil
类中的方法来进行权限校验。
当然,让我们继续并清晰地完成getRoleList
方法的实现,并简要介绍如何使用SA-Token进行权限校验。
实现StpInterface接口
java
@Component
public class StpInterfaceImpl implements StpInterface {
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// 假设这里通过loginId(用户ID)从数据库或其他数据源查询用户的权限码集合
// ...
// 示例:返回一个包含权限码的列表
List<String> permissions = new ArrayList<>();
permissions.add("user.add");
permissions.add("user.update");
permissions.add("user.delete");
// 根据实际情况添加更多权限码
return permissions;
}
@Override
public List<String> getRoleList(Object loginId, String loginType) {
// 假设这里通过loginId(用户ID)从数据库或其他数据源查询用户的角色标识集合
// ...
// 示例:返回一个包含角色标识的列表
List<String> roles = new ArrayList<>();
roles.add("admin");
roles.add("user");
// 根据实际情况添加更多角色标识
return roles;
}
}
使用SA-Token进行权限校验
在Spring Boot项目中,你可以使用SA-Token提供的StpUtil
类中的方法来进行权限校验。以下是一些常用的权限校验方法:
checkPermission(String permission)
: 校验当前账号是否拥有指定权限码checkRole(String role)
: 校验当前账号是否拥有指定角色标识hasPermission(String permission)
: 判断当前账号是否拥有指定权限码(不抛出异常)hasRole(String role)
: 判断当前账号是否拥有指定角色标识(不抛出异常)
示例:在Controller中使用权限校验
java
@RestController
@RequestMapping("/user")
public class UserController {
// ... 其他方法 ...
@PostMapping("/add")
public SaResult addUser(@RequestBody User user) {
// 校验当前账号是否拥有"user.add"权限
StpUtil.checkPermission("user.add");
// 如果校验通过,则执行添加用户的逻辑
// ...
return SaResult.ok("用户添加成功");
}
@PutMapping("/update/{id}")
public SaResult updateUser(@PathVariable Long id, @RequestBody User user) {
// 校验当前账号是否拥有"user.update"权限
StpUtil.checkPermission("user.update");
// 如果校验通过,则执行更新用户的逻辑
// ...
return SaResult.ok("用户更新成功");
}
// ... 其他需要权限校验的方法 ...
}
在上述示例中,addUser
方法通过StpUtil.checkPermission("user.add")
来校验当前登录的账号是否拥有"user.add"权限。如果当前账号没有该权限,则SA-Token会抛出异常,并默认由Spring Boot的全局异常处理器(如果你配置了的话)来处理这个异常,通常返回给前端一个错误响应。
同样地,updateUser
方法通过StpUtil.checkPermission("user.update")
来校验当前账号是否拥有"user.update"权限。
三、其他常用功能
SA-Token还提供了许多其他功能,如:
- 会话管理:支持踢出其他设备登录、获取当前会话信息等功能。
- OAuth2.0:支持OAuth2.0第三方登录。
- 分布式Session:支持基于Redis的分布式Session会话共享。
- 注解鉴权 :通过
@SaCheckLogin
、@SaCheckPermission
等注解实现方法级别的权限校验。 - 自动续签:支持Token的自动续签功能,避免用户频繁登录。
四、总结
通过整合SA-Token到Spring Boot项目中,你可以轻松实现登录认证、权限认证、会话管理等一系列权限控制功能。SA-Token以其简单、优雅的设计理念和丰富的功能,为开发者提供了极大的便利。希望本文的详细介绍能够帮助你更好地理解和使用SA-Token。