先上连接:Sa-Token
Sa-Token 是一个轻量级 Java 权限认证框架,专注于 登录认证、权限认证、Session会话 等核心功能。以下是其核心功能及在文章发布场景中
一、核心功能概览
登录认证
支持账号密码登录、第三方登录、无状态登录等
提供记住我(Remember Me)功能
多端登录控制(如:允许/禁止同账号多地登录)
权限认证
角色验证 (
@SaCheckRole("admin")
)权限验证 (
@SaCheckPermission("article:add")
)支持多维度权限校验(AND/OR逻辑)
会话管理
分布式 Session 管理
临时 Token、Token 续期、强制下线
活跃监控(查询在线用户)
安全防护
防止重复登录、账号封禁
密码加密、防 CSRF 攻击
自动续签 Token 有效期
集成扩展
支持 Redis 集成(分布式环境)
单点登录(SSO)、OAuth2.0
与 Spring Boot、WebFlux、Solon 等框架无缝整合
二、发布文章场景下的使用步骤
假设你的系统需要实现:用户登录后,拥有 article:add
权限的用户才能发布文章。
1. 引入依赖
<!-- Spring Boot 环境 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.37.0</version>
</dependency>
2. 配置 Sa-Token
# application.yml
sa-token:
token-name: satoken # Token名称
timeout: 86400 # Token有效期(秒),默认30分钟
is-concurrent: true # 允许并发登录
is-share: false # 禁止共享Token(每个端独立登录)
3. 用户登录
@PostMapping("/login")
public String login(String username, String password) {
// 1. 校验用户名密码(此处模拟)
if (!"zhang".equals(username) || !"123456".equals(password)) {
return "登录失败";
}
// 2. 登录并分配权限(实际应从数据库查询权限)
StpUtil.login(10001);
StpUtil.getSession().set("user", getUserDetails(username));
StpUtil.getSession().setPermissionList(Arrays.asList("article:add", "article:edit"));
return "登录成功,Token:" + StpUtil.getTokenValue();
}
4. 权限校验(发布文章接口)
@SaCheckPermission("article:add")
@PostMapping("/article/publish")
public JsonResult publishArticle(@RequestBody Article article) {
// 获取当前用户ID
long userId = StpUtil.getLoginIdAsLong();
// 业务逻辑:保存文章
articleService.saveArticle(userId, article);
return JsonResult.ok("发布成功");
}
5. 路由拦截(可选)
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截需要登录的接口
registry.addInterceptor(new SaInterceptor(handle -> {
StpUtil.checkLogin();
})).addPathPatterns("/article/**");
}
}
三、核心 API 速查
四、高级功能扩展
1. 记住我(Remember Me)
// 登录时设置(第二个参数为是否持久化)
StpUtil.login(10001, true);
2. 角色校验
@SaCheckRole("writer") // 要求用户拥有 writer 角色
@PostMapping("/article/draft")
public JsonResult saveDraft(...) { ... }
3. 动态权限(从数据库加载)
// 自定义权限验证逻辑
@SaCheckPermission(
value = {"article:add", "article:edit"},
mode = SaMode.CUSTOM,
type = PermissionType.CUSTOM
)
public JsonResult customCheck() { ... }
4. 分布式会话(集成 Redis)
sa-token:
is-share: true # 开启共享会话
token-prefix: "tkn:" # Redis key前缀
# 配置 Redis 连接(以 Jedis 为例)
jedis:
host: 127.0.0.1
port: 6379
五、最佳实践建议
权限设计
使用资源:操作
格式(如article:delete
)细化权限颗粒度。异常处理
通过全局拦截器捕获NotLoginException
、NotPermissionException
返回统一错误码。会话管理
定期清理无效 Token:StpUtil.searchSession(pageSize, callback)
。安全加固
敏感操作(如删除文章)建议二次验证密码。
评论区