若依开源框架中@PreAuthorize实现接口权限调用的机制

Administrator
Administrator
发布于 2025-04-30 / 16 阅读
0
0

若依开源框架中@PreAuthorize实现接口权限调用的机制

若依(RuoYi)是一个基于SpringBoot和Vue的前后端分离权限管理系统,它通过Spring Security的@PreAuthorize注解实现了细粒度的接口权限控制。以下是其实现原理和工作流程:

核心实现机制

  1. 权限标识定义​:

    • 在系统中,每个权限都有一个唯一的标识符,如system:user:list表示用户列表查询权限

    • 这些权限标识存储在数据库的sys_menu表中

  2. 注解使用​:

    java

    复制

    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user) {
        // 业务逻辑
    }
  3. 权限验证流程​:

    • 用户登录后,系统会加载该用户的所有权限并存入SecurityContext

    • 当请求带有@PreAuthorize注解的接口时,Spring Security会:

      1. 解析注解中的表达式

      2. 调用@ss.hasPermi()方法进行权限验证

      3. 如果验证失败,抛出AccessDeniedException

关键组件解析

  1. PermissionService (ss)​​:

    • 若依自定义的权限服务类,实现了权限验证逻辑

    • 核心方法hasPermi检查当前用户是否拥有指定权限

  2. Security配置​:

    • 在Spring Security配置中启用了方法级安全:

    java

    复制

    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        // 其他配置
    }
  3. 权限数据加载​:

    • 用户登录时,SysLoginService会查询用户权限并存入LoginUser对象

    • 通过JwtAuthenticationTokenFilter将权限信息设置到SecurityContext

前后端协作

  1. 前端部分​:

    • Vue前端通过vue-routerbeforeEach钩子进行路由权限验证

    • 按钮级别权限使用v-hasPermi指令控制显示/隐藏

  2. 后端部分​:

    • 提供/getRouters接口返回用户有权限访问的路由菜单

    • 提供/getInfo接口返回用户权限信息

扩展与自定义

若依的权限系统支持灵活扩展:

  • 可以自定义权限验证逻辑,修改PermissionService

  • 支持角色权限(@PreAuthorize("@ss.hasRole('admin')"))

  • 支持逻辑组合(@PreAuthorize("@ss.hasPermi('system:user:add') OR @ss.hasPermi('system:user:edit')"))

这种设计使得若依框架能够实现细粒度的权限控制,同时保持代码的清晰和可维护性。


评论