Ruoyi-Vue 用户菜单权限机制详解:从 RBAC 到接口级控制
·
目录
三、后端权限验证:Spring Security 与接口注解
2.UserDetailsService 加载用户角色与权限
3.Authentication 对象存入 SecurityContextHolder
一.引言
1.1项目背景
Ruoyi-Vue(若依管理系统)是一个基于 Spring Boot + Vue 的前后端分离框架,广泛用于企业级应用开发。其权限控制系统以 RBAC(Role-Based Access Control) 为核心,结合前端动态渲染与后端接口校验,实现了“菜单显隐 + 接口拦截”的双重安全防护。
1.2为什么要进行权限控制?
- 安全性:防止未授权用户访问敏感功能(如删除数据、修改配置)
- 灵活性:支持动态角色分配与权限变更(无需重启服务)
- 数据隔离:不同用户只能查看/操作其权限范围内的数据(如部门经理仅查看本部门数据)
二.前端权限控制:动态菜单与按钮显隐
2.1 动态菜单加载逻辑
用户登录后,前端通过 GET /getInfo 接口获取权限菜单,并动态生成路由:

2.2 按钮级权限控制
通过 Vue 自定义指令 v-hasPermi 控制按钮显隐:

三、后端权限验证:Spring Security 与接口注解
3.1 Spring Security 认证流程
1. 请求拦截与凭证封装
用户提交登录表单(UsernamePasswordAuthenticationFilter作为 Spring Security 过滤器链中的关键组件,负责拦截并处理认证请求,提取并封装凭证:
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (this.postOnly && !request.getMethod().equals("POST")) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
} else {
String username = this.obtainUsername(request);
username = username != null ? username.trim() : "";
String password = this.obtainPassword(request);
password = password != null ? password : "";
UsernamePasswordAuthenticationToken authRequest = UsernamePasswordAuthenticationToken.unauthenticated(username, password);
this.setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
}
}
2.UserDetailsService 加载用户角色与权限
从数据源获取用户详细信息(包括角色和权限)
3.Authentication 对象存入 SecurityContextHolder
将认证结果存储到当前请求的线程上下文中
3.2授权阶段
通过 @PreAuthorize 注解校验接口权限:

四.实战:新增自定义接口与权限验证
4.1创建新接口

4.2添加权限标识到菜单

4.3角色分配权限

4.2 前端配置
设置权限控制

设置提示信息

五.测试
5.1登录普通账号,给权限测试

5.2登录普通账号,不给权限测试


六、总结:构建高安全性的权限系统
- 双校验机制:前端控制显隐,后端控制访问
- RBAC 模型优势:通过角色聚合权限,简化管理
- 动态权限加载:Redis 缓存与实时更新保障灵活性
更多推荐




所有评论(0)