若依(RuoYi)是一个基于SpringBoot和Vue的前后端分离权限管理系统,它通过Spring Security的@PreAuthorize
注解实现了细粒度的接口权限控制。以下是其实现原理和工作流程:
核心实现机制
权限标识定义:
在系统中,每个权限都有一个唯一的标识符,如
system:user:list
表示用户列表查询权限这些权限标识存储在数据库的
sys_menu
表中
注解使用:
java
复制
@PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/list") public TableDataInfo list(SysUser user) { // 业务逻辑 }
权限验证流程:
用户登录后,系统会加载该用户的所有权限并存入SecurityContext
当请求带有
@PreAuthorize
注解的接口时,Spring Security会:解析注解中的表达式
调用
@ss.hasPermi()
方法进行权限验证如果验证失败,抛出
AccessDeniedException
关键组件解析
PermissionService (ss):
若依自定义的权限服务类,实现了权限验证逻辑
核心方法
hasPermi
检查当前用户是否拥有指定权限
Security配置:
在Spring Security配置中启用了方法级安全:
java
复制
@EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { // 其他配置 }
权限数据加载:
用户登录时,
SysLoginService
会查询用户权限并存入LoginUser
对象通过
JwtAuthenticationTokenFilter
将权限信息设置到SecurityContext
前后端协作
前端部分:
Vue前端通过
vue-router
的beforeEach
钩子进行路由权限验证按钮级别权限使用
v-hasPermi
指令控制显示/隐藏
后端部分:
提供
/getRouters
接口返回用户有权限访问的路由菜单提供
/getInfo
接口返回用户权限信息
扩展与自定义
若依的权限系统支持灵活扩展:
可以自定义权限验证逻辑,修改
PermissionService
支持角色权限(
@PreAuthorize("@ss.hasRole('admin')")
)支持逻辑组合(
@PreAuthorize("@ss.hasPermi('system:user:add') OR @ss.hasPermi('system:user:edit')")
)
这种设计使得若依框架能够实现细粒度的权限控制,同时保持代码的清晰和可维护性。