当前位置: 首页 > news >正文

RuoYi系统角色权限划分与控制

RuoYi 采用RBAC(基于角色的访问控制)模型,核心关系:用户 → 角色 → 菜单/权限(按钮)。权限字符串格式为系统:模块:操作(如system:user:add)。下面分权限划分、页面权限、按钮权限、后端接口权限四部分说明,并附完整可运行代码示例。


一、角色与权限划分(核心模型)

1. 数据库表关系(核心)

  • sys_user:用户
  • sys_role:角色
  • sys_menu:菜单/按钮(含权限字段perms
  • sys_user_role:用户 ↔ 角色关联
  • sys_role_menu:角色 ↔ 菜单/按钮关联

2. 权限级别

  1. 菜单权限:控制左侧菜单是否显示(页面级)
  2. 按钮权限:控制页面内按钮/元素显示(元素级)
  3. 接口权限:后端接口访问控制(API 级)
  4. 数据权限:控制数据范围(部门/本人等)

3. 权限标识规范

系统:模块:操作 system:user:list # 用户列表 system:user:add # 新增 system:user:edit # 编辑 system:user:remove # 删除 system:user:export # 导出 *:*:* # 超级管理员(所有权限)

二、页面(路由)权限控制

1. 前端路由守卫(Vue 版)

src/permission.js(路由拦截)

importrouterfrom'./router'import{ElMessage}from'element-plus'importuseUserStorefrom'@/store/modules/user'// 白名单constwhiteList=['/login','/register']router.beforeEach((to,from,next)=>{constuserStore=useUserStore()// 已登录if(userStore.token){if(to.path==='/login'){next({path:'/'})}else{// 判断是否有用户信息if(userStore.permissions.length===0){// 获取用户信息、权限userStore.getInfo().then(()=>{next({...to,replace:true})}).catch(err=>{userStore.logout().then(()=>{ElMessage.error(err||'权限校验失败')next('/login')})})}else{next()}}}else{// 未登录if(whiteList.includes(to.path)){next()}else{next('/login')}}})

2. 动态路由(后端返回菜单)

src/store/modules/user.js(获取权限)

import{login,logout,getInfo}from'@/api/login'import{defineStore}from'pinia'constuseUserStore=defineStore('user',{state:()=>({token:localStorage.getItem('token')||'',permissions:[],// 权限标识集合roles:[]// 角色集合}),actions:{// 获取用户信息getInfo(){returnnewPromise((resolve,reject)=>{getInfo().then(res=>{constuser=res.user// 超级管理员if(user.userId===1){this.permissions=['*:*:*']}else{this.permissions=res.permissions}this.roles=res.rolesresolve(res)}).catch(err=>reject(err))})}}})

三、按钮(元素)权限控制(最常用)

1. 自定义指令v-hasPermi(核心)

(1)指令定义:src/directive/permission/hasPermi.js
importuseUserStorefrom'@/store/modules/user'exportdefault{mounted(el,binding){const{value}=bindingconstall_permission="*:*:*"constuserStore=useUserStore()constpermissions=userStore.permissionsif(value&&Array.isArray(value)&&value.length>0){// 判断是否有权限consthasPermission=permissions.some(perm=>{returnall_permission===perm||value.includes(perm)})// 无权限则移除元素if(!hasPermission){el.parentNode&&el.parentNode.removeChild(el)}}else{thrownewError(`请设置权限标识,如 v-hasPermi="['system:user:add']"`)}}}
(2)指令注册:src/directive/index.js
importhasPermifrom'./hasPermi'importhasRolefrom'./hasRole'exportdefaultfunctiondirective(app){app.directive('hasPermi',hasPermi)// 权限指令app.directive('hasRole',hasRole)// 角色指令}
(3)全局注册:src/main.js
import{createApp}from'vue'importAppfrom'./App.vue'importdirectivefrom'./directive'constapp=createApp(App)directive(app)// 注册所有指令app.mount('#app')

2. 页面按钮使用示例(Vue 模板)

<template> <div> <!-- 单个权限:新增按钮 --> <el-button type="primary" icon="plus" v-hasPermi="['system:user:add']" @click="handleAdd" > 新增用户 </el-button> <!-- 单个权限:编辑按钮 --> <el-button type="success" icon="edit" v-hasPermi="['system:user:edit']" @click="handleEdit" > 编辑 </el-button> <!-- 多个权限满足其一 --> <el-button type="warning" v-hasPermi="['system:user:export', 'system:user:view']" > 导出/查看 </el-button> <!-- 角色控制:仅 admin 可见 --> <el-button type="danger" v-hasRole="['admin']" @click="handleDelete" > 删除 </el-button> </div> </template>

3. 表格操作列示例

<el-table-column label="操作" width="180"> <template #default="scope"> <el-button size="mini" text icon="edit" v-hasPermi="['system:user:edit']" @click="handleEdit(scope.row)" > 编辑 </el-button> <el-button size="mini" text icon="delete" v-hasPermi="['system:user:remove']" @click="handleDelete(scope.row)" > 删除 </el-button> </template> </el-table-column>

四、后端接口权限控制(Spring Boot 版)

1. 注解方式(@PreAuthorize/@RequiresPermissions

(1)Controller 层(页面/按钮对应接口)
@RestController@RequestMapping("/system/user")publicclassSysUserController{/** * 查询用户列表(页面权限) */@PreAuthorize("hasPermission('system:user:list')")@GetMapping("/list")publicTableDataInfolist(SysUseruser){startPage();List<SysUser>list=userService.selectUserList(user);returngetDataTable(list);}/** * 新增用户(按钮权限) */@PreAuthorize("hasPermission('system:user:add')")@PostMappingpublicAjaxResultadd(@RequestBodySysUseruser){returntoAjax(userService.insertUser(user));}/** * 修改用户(按钮权限) */@PreAuthorize("hasPermission('system:user:edit')")@PutMappingpublicAjaxResultedit(@RequestBodySysUseruser){returntoAjax(userService.updateUser(user));}/** * 删除用户(按钮权限) */@PreAuthorize("hasPermission('system:user:remove')")@DeleteMapping("/{userIds}")publicAjaxResultremove(@PathVariableLong[]userIds){returntoAjax(userService.deleteUserByIds(userIds));}}
(2)权限实现:UserRealm(Shiro 版)
publicclassUserRealmextendsAuthorizingRealm{@OverrideprotectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){SysUseruser=ShiroUtils.getSysUser();SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo();// 超级管理员if(user.isAdmin()){info.addStringPermission("*:*:*");}else{// 获取用户权限Set<String>perms=menuService.selectPermsByUserId(user.getUserId());info.setStringPermissions(perms);}returninfo;}}

五、权限配置(后台操作)

  1. 菜单管理:新增菜单/按钮,填写权限字符(如system:user:add
  2. 角色管理:给角色分配菜单/按钮权限
  3. 用户管理:给用户分配角色

六、总结

  • 页面权限:路由守卫 + 动态菜单
  • 按钮权限v-hasPermi自定义指令(前端隐藏)
  • 接口权限@PreAuthorize(后端拦截)
  • 权限字符串系统:模块:操作,统一易维护
http://www.jsqmd.com/news/622939/

相关文章:

  • C#如何用S7.NET快速读写西门子PLC数据?保姆级教程(附代码)
  • CosyVoice-300M效果深度解析:模拟“春晚魔术揭秘”风格的语音讲解
  • 深入解析SGP4算法库:卫星轨道计算的完整实战指南
  • 从手机指南针到导弹制导:惯性导航初始校准的5个关键误区
  • Vision Master 视觉软件应用-字符识别
  • Python 系列教案第 3 课:中高阶难度批量文件重命名
  • 六位数码管静态动态显示
  • 分析灶福星家用猛火灶大火力优势,在广州选购它性价比高吗? - mypinpai
  • Verilog generate for循环 vs 普通for循环:如何选择才不会出错?
  • FastbootEnhance解决方案:Windows平台Android设备底层管理技术实现
  • 如何用Pulover‘s Macro Creator实现零代码自动化?免费脚本生成工具完全指南
  • 【项目实战】基于protobuf的发布订阅式消息队列(2)—— 线程池
  • 2026年上海家宴猛火灶定制专家排名,哪家性价比高 - 工业品牌热点
  • 专业级QMC音频解码器实战指南:开源跨平台格式转换解决方案
  • [极客大挑战 2023] HiddenCode
  • 多线程--第一次小结
  • Hyperf方案 飞书消息卡片交互 - 发送可交互的消息卡片(按钮/下拉框),用户点击后回调到 Hyperf 服务处理业务
  • DeOldify图像上色服务:快速修复老旧照片,色彩自然还原
  • GitHub中文界面插件完整指南:一键实现全平台中文化
  • 盘点纸飞机艺术岛的优势在哪里,苏州热门户外休闲园区推荐 - myqiye
  • 3步突破Windows 11硬件限制:老旧电脑升级完整方案
  • 2026年纺织品市场测评报告:头部面料供应商能力拆解与选型指南 - 2026年企业推荐榜
  • 3大核心功能揭秘:HSTracker如何让macOS炉石玩家实现智能决策优化
  • 忍者像素绘卷微信小程序离线能力:Service Worker缓存像素模板
  • HTML标签必须闭合吗_哪些标签可以省略闭合【解答】
  • WarcraftHelper终极指南:3步解决魔兽争霸III兼容性问题
  • GLM-OCR AI编程辅助工具:自动生成代码注释与文档
  • 3大核心功能解析:ArchivePasswordTestTool高效恢复加密压缩包密码
  • 企业级Multi-Agent落地的组织变革:从职能型到项目制的重构
  • Topit:重塑数字注意力流,Mac端智能视觉层管理终极方案