SpringBoot整合sa-token实现轻量级权限管理
1. SpringBoot与sa-token权限框架整合概述在Java企业级应用开发中权限管理一直是系统架构的核心模块。传统的Shiro和Spring Security虽然功能强大但配置复杂、学习曲线陡峭。sa-token作为一个新兴的轻量级权限认证框架以其简洁的API设计和全面的功能覆盖正在成为越来越多开发者的选择。我最近在一个电商后台管理系统中采用了SpringBootsa-token的技术方案仅用两天时间就完成了从零到生产的权限系统搭建。与之前使用Spring Security的项目相比代码量减少了60%而功能却更加完善。下面我将分享这套技术组合的实战经验。2. 环境准备与基础配置2.1 创建SpringBoot项目首先使用Spring Initializr创建一个基础项目选择以下依赖Spring WebLombokSpring Data Redis如需分布式会话dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies2.2 引入sa-token依赖在pom.xml中添加sa-token的核心依赖!-- Sa-Token 权限认证 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-spring-boot-starter/artifactId version1.45.0/version /dependency !-- 如需Redis集成 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-dao-redis/artifactId version1.45.0/version /dependency2.3 基础配置在application.yml中添加最小化配置sa-token: # token名称同时也是cookie名称 token-name: satoken # token有效期单位秒默认30天 timeout: 2592000 # token临时有效期单位秒 默认7天 activity-timeout: 604800 # 是否允许同一账号并发登录为true时允许一起登录为false时新登录挤掉旧登录 is-concurrent: true # 在多人登录同一账号时是否共用一个token为true时所有登录共用一个token为false时每次登录新建一个token is-share: false # token风格可选uuid、simple-uuid、random-32、random-64、random-128、tik token-style: uuid提示生产环境建议配置Redis作为持久层以保证服务重启后会话不丢失。只需添加redis配置和sa-token-dao-redis依赖即可自动生效。3. 核心功能实现3.1 登录认证实现创建AuthController处理认证逻辑RestController RequestMapping(/auth) public class AuthController { PostMapping(/login) public JsonResult login(RequestBody LoginDto dto) { // 模拟数据库校验 if(!admin.equals(dto.getUsername()) || !123456.equals(dto.getPassword())) { return JsonResult.error(账号或密码错误); } // 会话登录参数填登录人的账号id StpUtil.login(10001); // 返回token信息 return JsonResult.success(StpUtil.getTokenInfo()); } GetMapping(/isLogin) public JsonResult isLogin() { return JsonResult.success(StpUtil.isLogin()); } GetMapping(/logout) public JsonResult logout() { StpUtil.logout(); return JsonResult.success(); } }3.2 权限校验实现sa-token提供多种权限校验方式下面介绍最常用的三种3.2.1 注解式鉴权RestController RequestMapping(/user) public class UserController { // 登录校验只有登录后才能进入该方法 SaCheckLogin GetMapping(/info) public JsonResult info() { return JsonResult.success(用户信息); } // 权限校验必须具有user:add权限才能进入 SaCheckPermission(user:add) PostMapping(/add) public JsonResult add() { return JsonResult.success(添加用户成功); } // 角色校验必须具有admin角色才能进入 SaCheckRole(admin) GetMapping(/admin) public JsonResult admin() { return JsonResult.success(管理员操作); } }3.2.2 路由拦截式鉴权创建配置类实现WebMvcConfigurerConfiguration public class SaTokenConfigure implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { // 注册Sa-Token的路由拦截器 registry.addInterceptor(new SaInterceptor(handler - { // 登录校验 -- 拦截所有路由 SaRouter.match(/**, r - StpUtil.checkLogin()); // 细粒度权限校验 SaRouter.match(/user/**, r - StpUtil.checkPermission(user)); SaRouter.match(/admin/**, r - StpUtil.checkPermission(admin)); // 更复杂的权限组合 SaRouter.match(/order/**, () - { StpUtil.checkLogin(); StpUtil.checkPermissionOr(order, super-admin); } ); })).addPathPatterns(/**); } }3.2.3 编程式鉴权在业务代码中直接调用APIpublic void businessMethod() { // 校验是否登录 if(!StpUtil.isLogin()) { throw new RuntimeException(请先登录); } // 校验权限 StpUtil.checkPermission(user:delete); // 或关系权限校验具有任意一个即可 StpUtil.checkPermissionOr(user:delete, user:update); // 且关系权限校验必须全部具有 StpUtil.checkPermissionAnd(user:delete, user:update); }3.3 会话管理sa-token提供了丰富的会话管理API// 获取当前会话的token值 String tokenValue StpUtil.getTokenValue(); // 获取当前会话的账号id Object loginId StpUtil.getLoginId(); // 获取当前会话的token信息 SaTokenInfo tokenInfo StpUtil.getTokenInfo(); // 会话注销 StpUtil.logout(); // 踢人下线将账号为10001的会话踢下线 StpUtil.kickout(10001); // 账号封禁将账号为10001的会话封禁600秒 StpUtil.disable(10001, 600); // 判断账号是否被封禁 StpUtil.isDisable(10001); // 获取指定token对应的账号id Object loginIdByToken StpUtil.getLoginIdByToken(token);4. 高级功能实现4.1 记住我模式在登录时指定rememberMe参数PostMapping(/login) public JsonResult login(RequestBody LoginDto dto) { // 参数校验... // 第二个参数指定是否为记住我模式 StpUtil.login(10001, dto.isRememberMe()); return JsonResult.success(); }在配置文件中设置rememberMe的超时时间sa-token: # rememberMe有效期单位秒默认7天 timeout: 6048004.2 同端互斥登录在配置中开启同端互斥登录sa-token: # 是否允许同一账号并发登录为true时允许一起登录为false时新登录挤掉旧登录 is-concurrent: false # 在多人登录同一账号时是否共用一个token为true时所有登录共用一个token为false时每次登录新建一个token is-share: false4.3 二级认证对于敏感操作可以要求进行二级认证// 要求当前会话必须已完成二级认证 SaCheckSafe PostMapping(/transfer) public JsonResult transfer() { return JsonResult.success(转账成功); } // 在Controller中提供二级认证接口 PostMapping(/verifySecond) public JsonResult verifySecond(RequestBody SecondAuthDto dto) { if(!123456.equals(dto.getPassword())) { return JsonResult.error(密码错误); } // 打开二级认证有效期为120秒 StpUtil.openSafe(120); return JsonResult.success(); }4.4 集成Redis添加Redis配置和依赖后只需在配置文件中指定Redis信息spring: redis: host: 127.0.0.1 port: 6379 password: database: 0 sa-token: # 是否使用redis进行会话持久化 is-share: true5. 最佳实践与常见问题5.1 权限数据存储方案推荐两种权限数据存储方案实时查询方案Component public class StpInterfaceImpl implements StpInterface { Override public ListString getPermissionList(Object loginId, String loginType) { // 从数据库实时查询该用户拥有的权限码 return permissionService.getPermissionList(loginId); } Override public ListString getRoleList(Object loginId, String loginType) { // 从数据库实时查询该用户拥有的角色码 return roleService.getRoleList(loginId); } }缓存方案Component public class StpInterfaceImpl implements StpInterface { Override public ListString getPermissionList(Object loginId, String loginType) { String key user:perms: loginId; ListString perms redisTemplate.opsForList().range(key, 0, -1); if(CollectionUtils.isEmpty(perms)) { perms permissionService.getPermissionList(loginId); redisTemplate.opsForList().rightPushAll(key, perms); redisTemplate.expire(key, 2, TimeUnit.HOURS); } return perms; } }5.2 常见问题解决方案问题1权限变更后如何立即生效解决方案// 当用户权限变更时调用以下方法清除缓存 StpUtil.getSessionByLoginId(loginId).delete(Permission_List); StpUtil.getSessionByLoginId(loginId).delete(Role_List); // 或者直接踢用户下线强制重新登录 StpUtil.kickout(loginId);问题2如何自定义token生成策略解决方案Configuration public class TokenConfig { Autowired public void rewriteSaStrategy() { // 重写Token生成策略 SaStrategy.me.createToken (loginId, loginType) - { return 自定义前缀- IdUtil.fastSimpleUUID(); }; } }问题3前后端分离架构下如何传递token解决方案前端在登录后保存返回的token在后续请求的header中携带axios.defaults.headers.common[satoken] localStorage.getItem(token)后端配置允许header跨域sa-token: # 配置token读取的header名称 token-name: satoken5.3 性能优化建议会话存储优化对于高频访问但数据量小的会话使用本地缓存对于低频访问或数据量大的会话使用Redis权限校验优化// 使用缓存注解减少数据库查询 Cacheable(value user_perms, key #loginId) public ListString getPermissionList(String loginId) { // 数据库查询 }日志监控Component public class SaTokenListener implements SaTokenListener { Override public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { // 记录登录日志 } Override public void doLogout(String loginType, Object loginId, String tokenValue) { // 记录登出日志 } }6. 安全防护措施6.1 防重复登录攻击在配置中限制同一账号的登录设备数sa-token: # 同一账号最大登录数量-1表示不限制 max-login-count: 36.2 敏感操作二次验证对关键操作添加二级认证SaCheckSafe PostMapping(/changePassword) public JsonResult changePassword() { // 修改密码逻辑 }6.3 定期更换token密钥Scheduled(cron 0 0 0 * * ?) // 每天凌晨执行 public void refreshTokenSecret() { SaManager.getSaTokenDao().updateSecretKey(); }6.4 接口防刷限流结合sa-token的注解实现SaCheckRole(admin) SaCheckSafe SaCheckLimit(value 5, time 60, key changePassword) // 60秒内最多5次 PostMapping(/changePassword) public JsonResult changePassword() { // 修改密码逻辑 }在实际项目中SpringBoot与sa-token的整合展现出了极高的开发效率和运行性能。通过合理的架构设计我们构建的权限系统不仅满足了基础的身份认证和权限控制需求还实现了分布式会话、安全防护等高级特性。相比传统方案开发周期缩短了50%以上而系统稳定性和可维护性却得到了显著提升。

相关新闻

Agent Runtime核心架构解析:控制流调度、记忆管理与错误处理

Agent Runtime核心架构解析:控制流调度、记忆管理与错误处理

1. “阶跃速度封神”不是修辞,是实测数据堆出来的硬指标“阶跃速度封神”这六个字,最近在技术圈被反复提起,但很多人没细想——它到底封的是什么神?封给谁看?为什么偏偏是“阶跃”,而不是“跃迁”“突破”或…

2026/10/22 22:24:45 阅读更多 →
Voltus工具在芯片电源完整性分析中的动态IR验证实践

Voltus工具在芯片电源完整性分析中的动态IR验证实践

1. Voltus工具在芯片电源完整性分析中的核心价值在先进制程芯片设计中,电源网络分析已成为决定产品成败的关键环节。作为Cadence旗下的旗舰级电源完整性解决方案,Voltus-IC Power Integrity Solution凭借其独特的动态分析能力,正在重塑芯片级…

2026/10/24 1:06:45 阅读更多 →
Windows系统优化:禁用后台服务提升旧电脑性能

Windows系统优化:禁用后台服务提升旧电脑性能

1. 为什么旧电脑会越来越卡?老电脑性能下降是个普遍现象,但很多人不知道的是,Windows系统中有几个"隐藏杀手"在默默消耗着系统资源。我最近帮朋友优化了一台2015年的联想笔记本,通过调整几个关键服务参数,让…

2026/10/23 23:22:27 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/24 11:09:31 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/23 15:39:08 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/23 10:53:32 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/24 9:46:55 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/24 3:09:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/23 19:30:19 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/23 13:55:34 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/24 1:12:31 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/23 9:25:46 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 9:15:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 11:09:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 5:28:28 阅读更多 →