news 2026/3/30 6:51:26

基于 RuoYi 框架的 **Sa-Token 核心配置类**

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 RuoYi 框架的 **Sa-Token 核心配置类**

你提供的这段代码是基于 RuoYi 框架的Sa-Token 核心配置类,主要作用是整合 Sa-Token 权限框架(包含 JWT 集成、登录验证、路由拦截、权限接口自定义等),实现系统的认证与授权控制。

一、代码整体功能总结

这个SaTokenConfig类是 Spring Boot 的配置类,实现了WebMvcConfigurer接口,核心职责:

  1. 注册 Sa-Token 拦截器,对系统所有请求进行登录验证(排除指定免拦截路径);
  2. 配置 Sa-Token 整合 JWT(简单模式);
  3. 注入自定义的权限接口实现类和 Token 存储层实现类;
  4. 结合 RuoYi 框架的SecurityProperties配置,灵活控制拦截/排除路径。

二、代码逐模块详细解释

1. 类注解与核心成员
@RequiredArgsConstructor// Lombok注解:生成包含final成员的构造方法,替代@Autowired@Slf4j// Lombok注解:生成日志对象@Configuration// 声明为Spring配置类publicclassSaTokenConfigimplementsWebMvcConfigurer{// 实现WebMvcConfigurer自定义SpringMVC配置privatefinalSecurityPropertiessecurityProperties;// 注入RuoYi的安全配置(包含免拦截路径等)}
  • WebMvcConfigurer:SpringMVC 扩展接口,这里主要用它的addInterceptors方法注册拦截器;
  • SecurityProperties:RuoYi 框架自定义的配置类,存放系统安全相关配置(如免拦截路径excludes)。
2. 核心方法:注册 Sa-Token 拦截器(addInterceptors)

这是整个配置类的核心,负责拦截所有请求并执行登录验证逻辑:

@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 注册路由拦截器,自定义验证规则registry.addInterceptor(newSaInterceptor(handler->{// 获取AllUrlHandler Bean(用于管理系统所有URL)AllUrlHandlerallUrlHandler=SpringUtils.getBean(AllUrlHandler.class);// 登录验证 -- 排除多个路径SaRouter// 匹配系统所有URL(从AllUrlHandler中获取).match(allUrlHandler.getUrls())// 对未排除的路径执行检查逻辑.check(()->{// 核心:检查用户是否已登录(是否有有效的Token)StpUtil.checkLogin();// 调试代码:打印Token剩余有效期(默认注释,避免性能影响)// if (log.isDebugEnabled()) {// log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout());// log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout());// }});}))// 拦截所有路径.addPathPatterns("/**")// 排除不需要拦截的路径(从SecurityProperties配置中读取).excludePathPatterns(securityProperties.getExcludes());}

关键逻辑拆解:

  • SaInterceptor:Sa-Token 提供的拦截器,入参是一个处理逻辑(SaHandler);
  • SaRouter:Sa-Token 的路由匹配工具,替代传统的if-else路径判断,更优雅;
  • match(allUrlHandler.getUrls()):匹配系统所有URL(由AllUrlHandler管理);
  • check(...):对匹配的URL执行登录检查,StpUtil.checkLogin()是核心——如果用户未登录,会抛出NotLoginException异常;
  • addPathPatterns("/**"):拦截所有请求;
  • excludePathPatterns(...):排除SecurityProperties中配置的免拦截路径(如登录接口、静态资源、swagger文档等)。
3. 配置 Sa-Token 整合 JWT(getStpLogicJwt)
@BeanpublicStpLogicgetStpLogicJwt(){// Sa-Token 整合 jwt (简单模式)returnnewStpLogicJwtForSimple();}
  • StpLogic:Sa-Token 的核心逻辑接口,负责Token的生成、验证、解析等;
  • StpLogicJwtForSimple:Sa-Token 提供的 JWT 简单模式实现,整合后 Token 会以 JWT 格式生成/解析,无需存储在服务端(适合无状态认证)。
4. 注入自定义权限接口(stpInterface)
@BeanpublicStpInterfacestpInterface(){// 权限接口实现(使用bean注入方便用户替换)returnnewSaPermissionImpl();}
  • StpInterface:Sa-Token 的权限接口,需实现getPermissionList(获取用户权限)和getRoleList(获取用户角色)方法;
  • SaPermissionImpl:RuoYi 框架自定义的实现类,用于从数据库/缓存中获取当前用户的角色和权限,支撑 Sa-Token 的hasRole/hasPerm等权限校验方法。
5. 自定义 Token 存储层(saTokenDao)
@BeanpublicSaTokenDaosaTokenDao(){// 自定义dao层存储returnnewPlusSaTokenDao();}
  • SaTokenDao:Sa-Token 的数据访问层接口,默认实现是内存存储,PlusSaTokenDao是 RuoYi 自定义的实现(通常基于 Redis 存储 Token,适配分布式系统);
  • 替换这个 Bean 可以自定义 Token 的存储方式(如 Redis、MySQL 等)。

三、关键依赖与运行条件

  1. 核心依赖:Sa-Token 核心包 + Sa-Token JWT 扩展包 + Spring Web;
  2. 配置依赖:SecurityProperties需在application.yml/application.properties中配置excludes免拦截路径;
  3. 自定义 Bean:AllUrlHandlerSaPermissionImplPlusSaTokenDao需提前在 Spring 容器中注册;
  4. 异常处理:系统需配置全局异常处理器,捕获NotLoginException(未登录)、NotPermissionException(无权限)等 Sa-Token 异常,返回统一格式的响应。

四、典型执行流程

  1. 客户端发起请求(如/system/user/list);
  2. Sa-Token 拦截器匹配路径:如果是excludes中的路径(如/login),直接放行;
  3. 非免拦截路径:执行StpUtil.checkLogin()检查 Token 是否有效;
  4. Token 有效:放行请求,后续可通过StpUtil获取当前用户信息、校验权限;
  5. Token 无效/不存在:抛出NotLoginException,全局异常处理器捕获后返回未登录响应(如{"code":401,"msg":"未登录"})。

总结

  1. 该类是 RuoYi 框架中 Sa-Token 的核心配置,通过注册拦截器实现全局登录验证,并通过排除路径灵活放行无需登录的接口;
  2. 核心逻辑是StpUtil.checkLogin()验证登录状态,同时整合 JWT 实现无状态认证、自定义StpInterface实现权限校验、自定义SaTokenDao实现 Token 分布式存储;
  3. 关键扩展点:可通过替换SaPermissionImpl自定义权限获取逻辑,替换PlusSaTokenDao自定义 Token 存储方式,修改securityProperties.getExcludes()配置免拦截路径。

你提到的@SaCheckPermission("system:dept:list")是 Sa-Token 框架提供的权限校验注解,用于在方法级别快速校验当前登录用户是否拥有指定的权限(这里是system:dept:list,即“系统-部门-列表”权限),是 RuoYi 框架中实现权限控制的核心注解之一。

一、核心概念解释

  • @SaCheckPermission:Sa-Token 提供的权限校验注解,可标注在Controller 方法上,核心作用是:在方法执行前,自动校验当前用户是否拥有注解中指定的权限,无权限则抛出NotPermissionException异常。
  • system:dept:list:RuoYi 框架的权限编码规范,格式为模块:功能:操作,示例解析:
    • system:系统模块(如用户、部门、角色等核心模块);
    • dept:部门功能;
    • list:列表操作(其他常见操作如add/edit/delete/export等)。

二、完整使用示例

结合 RuoYi 框架的 Controller 层,展示@SaCheckPermission的典型用法:

importcn.dev33.satoken.annotation.SaCheckPermission;importcom.ruoyi.common.core.controller.BaseController;importcom.ruoyi.common.core.domain.AjaxResult;importcom.ruoyi.system.domain.SysDept;importcom.ruoyi.system.service.ISysDeptService;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;importjava.util.List;/** * 部门管理 Controller * 对应 RuoYi 框架的 system:dept 模块 */@RestController@RequestMapping("/system/dept")publicclassSysDeptControllerextendsBaseController{@ResourceprivateISysDeptServicedeptService;/** * 查询部门列表 * @SaCheckPermission("system:dept:list"):校验当前用户是否有“部门列表”权限 */@SaCheckPermission("system:dept:list")@GetMapping("/list")publicAjaxResultlist(SysDeptdept){List<SysDept>list=deptService.selectDeptList(dept);returnAjaxResult.success(list);}/** * 新增部门 * 校验“部门新增”权限 */@SaCheckPermission("system:dept:add")@GetMapping("/add")publicAjaxResultadd(SysDeptdept){returntoAjax(deptService.insertDept(dept));}/** * 批量删除部门 * 支持多权限校验(数组形式):需同时拥有 delete 和 batchDelete 权限 */@SaCheckPermission({"system:dept:delete","system:dept:batchDelete"})@GetMapping("/batchDelete")publicAjaxResultbatchDelete(Long[]deptIds){returntoAjax(deptService.deleteDeptByIds(deptIds));}}

三、注解核心参数说明

@SaCheckPermission支持多个参数,满足不同权限校验场景:

参数类型默认值作用
valueString[]{}要校验的权限编码(如"system:dept:list"),数组表示“同时拥有所有权限”
modeString“AND”多权限校验模式:
-AND:必须拥有所有权限(默认)
-OR:拥有其中一个即可
orRoleString[]{}兜底角色:如果用户没有指定权限,但拥有该角色,也可通过校验
示例:不同参数组合
// 场景1:拥有 list 或 export 权限即可@SaCheckPermission(value={"system:dept:list","system:dept:export"},mode="OR")@GetMapping("/export")publicAjaxResultexport(SysDeptdept){/* ... */}// 场景2:无 list 权限,但拥有 admin 角色也可访问@SaCheckPermission(value="system:dept:list",orRole="admin")@GetMapping("/list")publicAjaxResultlist(SysDeptdept){/* ... */}

四、权限校验的底层逻辑(与你之前的 SaTokenConfig 关联)

  1. 触发时机:请求进入 Controller 方法前,Sa-Token 拦截器会扫描注解,触发权限校验;
  2. 权限获取:通过你之前配置的StpInterface实现类(SaPermissionImpl),调用getPermissionList()方法,获取当前登录用户的所有权限编码;
  3. 校验逻辑:对比注解中的权限编码与用户拥有的权限,不匹配则抛出NotPermissionException
  4. 异常处理:RuoYi 框架的全局异常处理器会捕获该异常,返回统一格式的无权限响应(如{"code":403,"msg":"没有权限"})。

五、注意事项

  1. 注解生效前提
    • 已配置 Sa-Token 拦截器(你的SaTokenConfig类已完成此操作);
    • 当前用户已登录(StpUtil.checkLogin()已通过);
    • SaPermissionImpl能正确从数据库/缓存中获取用户权限。
  2. 注解作用范围
    • 标注在类上:对类中所有方法生效;
    • 标注在方法上:仅对当前方法生效(优先级高于类注解)。
  3. 权限编码规范:RuoYi 框架严格遵循模块:功能:操作规范,建议不要随意修改格式,否则会导致权限管理模块(如角色授权)无法正常识别。

总结

  1. @SaCheckPermission("system:dept:list")是 Sa-Token 用于方法级权限校验的核心注解,校验当前用户是否拥有指定权限编码;
  2. 注解支持多权限、AND/OR 模式、角色兜底等灵活校验规则,适配不同业务场景;
  3. 其底层依赖你配置的StpInterfaceSaPermissionImpl)获取用户权限,需确保权限数据能正确加载。
    你提到的@SaCheckPermission("system:dept:list")是 Sa-Token 框架提供的权限校验注解,用于在方法级别快速校验当前登录用户是否拥有指定的权限(这里是system:dept:list,即“系统-部门-列表”权限),是 RuoYi 框架中实现权限控制的核心注解之一。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 23:30:38

Qwen2.5-7B智能写作对比:云端3小时=本地3天,效率飙升

Qwen2.5-7B智能写作对比&#xff1a;云端3小时本地3天&#xff0c;效率飙升 1. 为什么自媒体团队需要云端AI写作测试 作为自媒体内容创作者&#xff0c;我们经常需要测试不同AI模型的写作效果。传统方式是在本地电脑上逐个运行模型对比&#xff0c;但会遇到两个致命问题&…

作者头像 李华
网站建设 2026/3/27 8:24:16

用NETTOPLCSIM在1小时内搭建智能仓储原型系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个智能仓储快速原型系统&#xff0c;功能包括&#xff1a;1) 可视化仓库布局编辑器 2) AGV路径规划模拟 3) 库存动态显示 4) 异常情况注入测试。要求使用MODBUS TCP协议仿真…

作者头像 李华
网站建设 2026/3/28 0:32:06

Qwen2.5-7B代码解释器:云端Jupyter集成,2块钱debug

Qwen2.5-7B代码解释器&#xff1a;云端Jupyter集成&#xff0c;2块钱debug 引言&#xff1a;程序员的AI调试助手 刚学编程时最怕什么&#xff1f;不是写代码&#xff0c;而是遇到报错却看不懂&#xff01;那些密密麻麻的错误信息就像天书&#xff0c;新手往往手足无措。传统解…

作者头像 李华
网站建设 2026/3/27 3:20:17

Git小乌龟零基础入门:从安装到第一个提交

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的Git小乌龟交互式学习应用。从安装向导开始&#xff0c;逐步引导用户完成&#xff1a;1) 软件安装和基本配置&#xff1b;2) 创建或克隆第一个仓库&#xff1b;3…

作者头像 李华
网站建设 2026/3/27 10:33:41

AI智能实体侦测服务冷启动问题:首次加载延迟优化技巧

AI智能实体侦测服务冷启动问题&#xff1a;首次加载延迟优化技巧 1. 背景与挑战&#xff1a;AI服务的“第一印象”至关重要 在现代AI应用中&#xff0c;用户体验往往从第一次交互开始。对于基于深度学习的智能服务而言&#xff0c;冷启动阶段的性能表现直接影响用户留存率和产…

作者头像 李华
网站建设 2026/3/28 19:38:33

传统VS AI:解决APK兼容性问题的效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个对比工具&#xff0c;模拟传统手动解决APK兼容性问题的流程和AI辅助流程。工具应记录两种方法的时间消耗、步骤复杂度和最终效果。提供可视化数据对比&#xff0c;并允许用…

作者头像 李华