news 2026/6/10 0:35:13

基于 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/6/9 21:10:13

银河麒麟软件商店AI助手:智能推荐与自动化安装

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个AI助手&#xff0c;集成到银河麒麟软件商店中&#xff0c;能够根据用户历史行为和偏好智能推荐软件。功能包括&#xff1a;1. 分析用户安装记录和使用频率&#xff0c;生成…

作者头像 李华
网站建设 2026/6/5 14:20:42

Qwen2.5-7B性能实测:云端比本地快多少?数据说话

Qwen2.5-7B性能实测&#xff1a;云端比本地快多少&#xff1f;数据说话 1. 引言&#xff1a;为什么要做这个测试&#xff1f; 作为一名技术博主&#xff0c;我最近在测试Qwen2.5-7B这款开源大语言模型时遇到了一个现实问题&#xff1a;用我的RTX 3060显卡本地运行&#xff0c…

作者头像 李华
网站建设 2026/6/9 23:54:28

NAVICAT FOR MYSQL:AI如何帮你高效管理数据库

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个AI辅助的数据库管理工具&#xff0c;集成NAVICAT FOR MYSQL的核心功能&#xff0c;支持自动生成SQL查询语句、智能分析数据库性能、检测潜在错误并提供修复建议。用户可以…

作者头像 李华
网站建设 2026/6/9 21:10:15

怕被割韭菜?Qwen2.5官方推荐的低成本体验方案

怕被割韭菜&#xff1f;Qwen2.5官方推荐的低成本体验方案 引言&#xff1a;为什么你需要这篇指南 最近Qwen2.5系列模型开源后&#xff0c;各种收费教程和"优化方案"如雨后春笋般出现。作为一位长期关注开源模型的开发者&#xff0c;我完全理解你的顾虑——动辄要求…

作者头像 李华
网站建设 2026/6/9 20:59:34

Qwen2.5-7B+AutoGPT联用:5块钱玩转自动化AI

Qwen2.5-7BAutoGPT联用&#xff1a;5块钱玩转自动化AI 1. 为什么你需要这个组合&#xff1f; 想象一下&#xff0c;你有一个能理解复杂指令的AI助手&#xff08;Qwen2.5-7B&#xff09;和一个能自动拆解任务的AI管家&#xff08;AutoGPT&#xff09;&#xff0c;它们配合起来…

作者头像 李华