Sa-Token 入门:一个简单易用的 Java 权限认证框架
在企业项目开发中,登录认证和权限控制几乎是必不可少的功能。
以前我们经常使用 Spring Security 来完成用户认证、权限管理等功能,但是 Spring Security 功能非常强大,同时也带来了较高的学习成本:
- 配置复杂
- 概念较多
- 自定义流程繁琐
- 对新手不太友好
近年来,国内出现了一些更加轻量化的权限认证框架,其中 Sa-Token 使用体验非常不错。
本文简单介绍 Sa-Token 的核心功能,并带大家快速体验一下。
一、什么是 Sa-Token?
Sa-Token 是一个国产 Java 权限认证框架,主要解决:
- 用户登录认证
- 权限校验
- 角色管理
- 单点登录
- Token 管理
- Session 会话
- 微服务鉴权
简单来说:
Sa-Token 就是帮助我们快速实现登录和权限控制的一套工具。
它的设计理念比较简单:
登录 → 生成 Token → 保存登录状态 → 请求时验证身份
开发者不需要关注大量底层细节。
二、Sa-Token 主要功能
Sa-Token 常用功能主要包括以下几个方面:
1. 登录认证
最基础的功能。
用户登录成功后:
StpUtil.login(userId);
Sa-Token 会自动生成 Token,并保存用户登录状态。
之后判断用户是否登录:
StpUtil.isLogin();
即可。
例如:
@GetMapping("/user/info")
public String info(){
if(StpUtil.isLogin()){
return "当前用户已登录";
}
return "请先登录";
}
2. 权限认证
比如后台管理系统:
管理员:
user:add
user:delete
user:update
普通用户:
user:view
可以通过 Sa-Token 判断:
StpUtil.checkPermission("user:add");
没有权限时,会自动抛出异常。
3. 角色认证
例如:
系统存在:
admin
vip
user
三个角色。
判断角色:
StpUtil.checkRole("admin");
只有管理员才能访问。
4. Token 管理
Sa-Token 内置 Token 管理能力:
例如:
- 强制某个用户下线
- 查询登录设备
- 多端登录控制
比如:
StpUtil.logout(userId);
可以直接让用户退出登录。
5. 分布式支持
在单体项目中:
Token 可以存在 JVM 内存。
但是微服务环境:
用户服务
订单服务
商品服务
支付服务
多个服务需要共享登录状态。
Sa-Token 支持 Redis 存储:
用户登录
|
|
Redis
|
多个服务共享认证状态
满足分布式项目需求。
三、Spring Security 和 Sa-Token 对比
两者都可以实现认证授权,但是设计理念不同。
| 对比 | Spring Security | Sa-Token |
|---|---|---|
| 定位 | 企业级安全框架 | 轻量权限认证框架 |
| 学习成本 | 较高 | 较低 |
| 配置复杂度 | 较复杂 | 简单 |
| 登录实现 | 需要配置认证流程 | 几行代码完成 |
| 权限控制 | 强大完善 | 简单易用 |
| OAuth支持 | 原生支持较好 | 提供支持 |
| 微服务鉴权 | 支持 | 支持 |
| 国内项目使用 | 广泛 | 越来越多 |
Spring Security 登录流程
Spring Security 通常需要:
请求
↓
Filter过滤器链
↓
AuthenticationManager
↓
AuthenticationProvider
↓
UserDetailsService
↓
SecurityContext
↓
认证成功
流程非常完善,但是对于普通业务系统:
比如:
- 用户登录
- 权限判断
- 管理后台
可能显得比较重。
Sa-Token 登录流程
Sa-Token 更简单:
用户登录
↓
StpUtil.login()
↓
生成Token
↓
保存状态
↓
请求验证Token
代码更加直观。
四、快速整合 Sa-Token
1. 添加依赖
Spring Boot 项目加入:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>1.38.0</version>
</dependency>
2. 添加配置
application.yml:
sa-token:
token-name: satoken
timeout: 2592000
is-log: true
含义:
- token 名称:satoken
- 有效期:30天
- 开启日志
3. 登录接口
示例:
@RestController
public class LoginController {
@GetMapping("/login")
public String login(String username){
// 模拟登录成功
if("admin".equals(username)){
StpUtil.login(10001);
return "登录成功";
}
return "登录失败";
}
@GetMapping("/check")
public String check(){
return "是否登录:"
+ StpUtil.isLogin();
}
}
访问:
/login?username=admin
登录成功。
再次访问:
/check
返回:
是否登录:true
五、什么时候选择 Sa-Token?
Sa-Token 比较适合:
✅ 中小型后台管理系统
例如:
- 商城后台
- 内容管理系统
- SaaS系统
- 企业内部系统
也适合:
✅ Spring Cloud 微服务项目
例如:
网关
|
用户服务
|
订单服务
|
支付服务
统一使用 Token 鉴权。
六、总结
Spring Security 是一个功能非常全面的安全框架,更适合:
- 大型企业系统
- 高安全要求系统
- 复杂认证场景
而 Sa-Token 最大特点:
简单、快速、国产化、上手成本低。
如果你的项目主要需求是:
用户登录
+
权限控制
+
角色管理
+
Token认证
那么 Sa-Token 是一个非常不错的选择。
后续可以继续学习:
- Sa-Token + Redis
- RBAC 权限模型
- 注解权限控制
- Spring Cloud 微服务鉴权
一步步搭建完整的权限认证体系。