核心内容摘要
汗水、纯白与心跳:青春在赛场与镜头下绽放
视频看了几百小时还迷糊关注我几分钟让你秒懂在开发 Web 项目时登录认证、权限控制、会话管理几乎是每个系统都绕不开的需求。
传统方案如 Spring Security 虽然强大但配置复杂、学习成本高而 JWT 又要自己处理 token 刷新、登出等问题。
有没有一个轻量、简单、功能全的权限框架答案就是 ——Sa-Token今天我们就用Spring Boot Java手把手教你集成 Sa-Token实现登录、鉴权、角色权限、踢人下线等核心功能10 分钟搞定权限系统
Sa-Token 是什么Sa-Token 是一个国产、轻量、高效的 Java 权限认证框架主打✅ 登录认证Token 管理✅ 权限验证角色 权限码✅ Session 会话分布式无状态✅ 踢人下线、账号封禁✅ 单点登录SSO、OAuth2 支持✅零配置启动API 极简官网https://sa-token.dev
cn
快速集成5 步搞定
添加 Maven 依赖dependency groupIdcn.dev33/groupId artifactIdsa-token-spring-boot-starter/artifactId version
1.
3
0/version !-- 建议使用最新版 -- /dependency⚠️ 注意不需要额外引入 Redis 依赖Sa-Token 默认使用内存存储生产环境建议配 Redis。
配置 application.yml可选sa-token: # token 名称默认 satoken token-name: Authorization # token 有效期秒默认 7 天 timeout: 2592000 # token 最低活跃时间秒默认 0不刷新 active-timeout: 1800 # 是否允许同一账号多地登录true允许false踢掉前一个 is-concurrent: true # 是否启用二级认证如短信验证码 is-share: false # token 风格默认为uuid token-style: uuid # 是否输出日志 is-log: true 初学者可以先不配全部用默认值
模拟用户登录接口RestController public class LoginController { // 模拟数据库用户实际应查数据库 private static final MapString, String USER_DB Map.of( admin, 123456, user, 123456 ); PostMapping(/login) public String login(RequestParam String username, RequestParam String password) { //
校验账号密码 if (!USER_DB.containsKey(username) || !USER_DB.get(username).equals(password)) { return 账号或密码错误; } //
写入当前登录用户 IDSa-Token 自动创建 Token 并绑定会话 StpUtil.login(10001L); // 假设 admin 的 ID 是 10001 //
返回 Token前端需保存到 localStorage 或 Cookie return 登录成功Token: StpUtil.getTokenValue(); } GetMapping(/logout) public String logout() { StpUtil.logout(); // 当前会话注销 return 已退出登录; } }✅ 调用StpUtil.login(userId)后Sa-Token 会自动生成 Token 并关联用户会话
受保护的接口需要登录才能访问RestController public class UserController { // 必须登录才能访问 GetMapping(/user/info) public Object getUserInfo() { // 获取当前登录用户 ID Long userId StpUtil.getLoginIdAsLong(); return Map.of(userId, userId, username, admin); } // 必须具有 admin 角色 GetMapping(/admin/setting) public String adminSetting() { // 校验是否具有 admin 角色会抛异常若无权限 StpUtil.checkRole(admin); return 管理员设置页面; } // 必须具有 user:delete 权限 GetMapping(/user/delete) public String deleteUser() { StpUtil.checkPermission(user:delete); return 删除用户成功; } }
全局拦截器自动鉴权Sa-Token 提供了注解式鉴权和路由拦截器两种方式。
我们这里用更灵活的拦截器。
Configuration public class SaTokenConfigure implements WebMvcConfigurer { // 注册 Sa-Token 拦截器 Override public void addInterceptors(InterceptorRegistry registry) { // 所有请求都校验 Token除了 /login 等公开接口 registry.addInterceptor(new SaRouteInterceptor()) .addPathPatterns(/**) .excludePathPatterns(/login, /doc.html, /webjars/**, /swagger-resources/**); } }✅ 这样所有未登录的请求访问/user/info都会返回401
权限模型角色 vs 权限码Sa-Token 支持两种权限控制类型方法说明角色StpUtil.hasRole(admin)用户属于某个角色如 admin、user权限码StpUtil.hasPermission(user:delete)细粒度操作权限推荐如何给用户分配角色/权限重写StpInterface接口Component public class StpInterfaceImpl implements StpInterface { // 返回用户拥有的角色集合 Override public ListString getRoleList(Object loginId, String loginType) { // 模拟ID10001 的用户是 admin if (
equals(loginId.toString())) { return Arrays.asList(admin); } return Arrays.asList(user); } // 返回用户拥有的权限码集合 Override public ListString getPermissionList(Object loginId, String loginType) { if (
equals(loginId.toString())) { return Arrays.asList(user:add, user:delete, user:update); } return Arrays.asList(user:add); } }✅ Sa-Token 会在调用checkRole()或checkPermission()时自动调用此接口
反例常见错误配置❌ 反例1忘记注册拦截器// 没有 addInterceptors - 所有接口无需登录也能访问后果安全漏洞任何人都能调用/admin/setting❌ 反例2登录后没返回 Token 给前端PostMapping(/login) public void login(...) { StpUtil.login(10001L); // 忘记 return token }后果前端不知道 Token 是什么后续请求无法携带一直 401❌ 反例3生产环境用内存存储默认Sa-Token 默认将会话存在JVM 内存中重启服务所有用户掉线✅ 正确做法集成 Redisdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependencySa-Token 会自动检测 Redis无需额外配置
高级功能一键实现功能代码示例踢某用户下线StpUtil.kickout(10001L);查询在线用户列表StpUtil.searchTokenValue(, 1, 10, true);临时提升权限StpUtil.openSafe(
; // 5分钟内免密操作单点登录配置is-concurrent: false新登录踢旧会话✅
六、