一、什么是 Sa-Token?
Sa-Token 是一个轻量级的 Java 权限认证框架,核心功能包括:
- 登录认证(Login)
- 权限认证(Permission)
- 会话管理(Session)
- 踢人下线(Kickout)
- 角色控制(Role)
- 多账号体系(Multiple Realm)
对比 Spring Security,它更轻量、配置更简单、API 更易用,非常适合快速开发场景。
二、快速集成 Sa-Token(Spring Boot 项目)
1. 添加依赖
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
最新版本请以官网为准。
2. 配置 application.yml
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: App-Token
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: false
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
is-share: true
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: uuid
# 是否输出操作日志
is-log: true
3. 编写登录接口
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/login")
public String doLogin(@RequestParam String username, @RequestParam String password) {
if("admin".equals(username) && "123456".equals(password)) {
// 登录成功,写入 token
StpUtil.login(10001); // 10001为模拟用户id
return "登录成功,Token:" + StpUtil.getTokenValue();
}
return "账号密码错误";
}
}
4. 权限控制示例
方式一:注解拦截权限
@SaCheckPermission("user:add")
@GetMapping("/add")
public String addUser() {
return "添加用户成功";
}
方式二:手动校验
@GetMapping("/delete")
public String deleteUser() {
StpUtil.checkPermission("user:delete");
return "删除用户成功";
}
三、退出登录和用户状态控制
@GetMapping("/logout")
public String logout() {
StpUtil.logout();
return "已退出登录";
}
四、权限设计建议
建议在用户登录后,将权限列表存入 Session 或缓存中(如 Redis),Sa-Token 的权限校验支持:
- 注解式校验(最常用)
- 编程式校验(业务灵活控制)
你还可以结合 RBAC 模型,用角色 + 权限组合实现更加细粒度的权限控制。
五、手动添加拦截器
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册 Sa-Token 拦截器,定义详细认证规则
registry.addInterceptor(new SaInterceptor(handler -> {
// 指定一条 match 规则
SaRouter
.match("/**") // 拦截的 path 列表,可以写多个 */
.notMatch("/system/login") // 排除掉的 path 列表,可以写多个
.check(r -> StpUtil.checkLogin()); // 要执行的校验动作,可以写完整的 lambda 表达式
})).addPathPatterns("/**");
}
}
六、总结
Sa-Token 是一个优秀的权限框架,适用于对安全性有要求但不需要 Spring Security 那么重的项目,特别适合:
- 后台管理系统
- 小程序接口后端
- 独立中台服务
优点总结:
- 上手快,API 简单直观
- 支持多端登录、单点登录、Token 续签等高级功能
- 适配 Spring Boot 无缝集成
Sa-Token 官方文档: sa-token.cc
如果你对权限设计、Token 管理、接口安全有兴趣,欢迎点赞、收藏、评论区交流!