功能权限
功能权限用于控制“用户能进入哪些菜单、能点击哪些按钮、能调用哪些受保护接口”。在 RuoYi Office 中,它由菜单、角色、用户三类数据共同组成,前端负责菜单树和按钮展示,后端通过 @PreAuthorize 校验权限标识。
本地实现位置
| 层 | 位置 |
|---|---|
| 菜单页面 | ruoyi-office-vben/apps/web-antd/src/views/system/menu |
| 角色页面 | ruoyi-office-vben/apps/web-antd/src/views/system/role |
| 菜单 Controller | yudao-module-system-server/.../permission/MenuController.java |
| 角色 Controller | .../permission/RoleController.java |
| 权限 Controller | .../permission/PermissionController.java |
权限模型
菜单既承载前端路由,也承载按钮权限。角色是权限分配的最小运营单元,用户通过角色继承菜单和按钮能力。
菜单管理
views/system/menu 使用树形表格维护菜单。常见菜单类型包括目录、菜单、按钮:
| 类型 | 主要用途 | 关键字段 |
|---|---|---|
| 目录 | 组织左侧导航层级 | 名称、父级、图标、排序 |
| 菜单 | 绑定具体路由页面 | 路由地址、组件路径、权限标识、状态 |
| 按钮 | 控制页面操作按钮 | 权限标识、父级菜单、状态 |
后端入口:
| 操作 | 接口 | 权限标识 |
|---|---|---|
| 创建菜单 | POST /system/menu/create | system:menu:create |
| 修改菜单 | PUT /system/menu/update | system:menu:update |
| 删除菜单 | DELETE /system/menu/delete | system:menu:delete |
| 菜单列表 | GET /system/menu/list | 页面查询使用 |
| 精简菜单 | GET /system/menu/list-all-simple、/simple-list | 角色分配菜单使用 |
在多租户开启时,MenuController#getSimpleMenuList 会按租户套餐过滤可选菜单,避免租户管理员分配未开通能力。
角色管理与菜单授权
views/system/role 支持角色新增、编辑、删除、导出、菜单权限和数据权限。菜单授权弹窗会先调用 /system/permission/list-role-menus 获取已有菜单,再提交 /system/permission/assign-role-menu。
| 操作 | 接口 | 权限标识 |
|---|---|---|
| 创建角色 | POST /system/role/create | system:role:create |
| 修改角色 | PUT /system/role/update | system:role:update |
| 删除角色 | DELETE /system/role/delete | system:role:delete |
| 角色分页 | GET /system/role/page | 页面查询使用 |
| 导出角色 | GET /system/role/export-excel | system:role:export |
| 查询角色菜单 | GET /system/permission/list-role-menus | system:permission:assign-role-menu |
| 分配角色菜单 | POST /system/permission/assign-role-menu | system:permission:assign-role-menu |
前后端权限如何对应
新增业务页面时,建议按以下顺序配置:
- 在菜单管理创建目录或菜单,填写路由、组件、排序和图标。
- 为新增、编辑、删除、导出等操作创建按钮菜单,权限标识使用
模块:资源:动作风格,例如system:user:create。 - 前端按钮通过
auth: ['system:user:create']控制展示。 - 后端接口通过
@PreAuthorize("@ss.hasPermission('system:user:create')")做最终拦截。 - 在角色管理中把菜单和按钮授权给角色。
多租户下的功能权限
如果开启 SaaS 多租户,租户套餐会限制租户可见菜单范围。PermissionController#assignRoleMenu 在保存角色菜单前会调用租户菜单过滤逻辑,将未开通菜单从提交数据中移除。因此,排查“角色勾选后没保存”的问题时,要同时检查角色页面和租户套餐。
常见问题
| 现象 | 排查方向 |
|---|---|
| 菜单不显示 | 检查菜单状态、父级状态、角色是否授权、路由组件是否存在 |
| 按钮不显示 | 检查按钮菜单权限标识与前端 auth 是否一致 |
| 接口返回无权限 | 检查后端 @PreAuthorize 标识是否已授权给当前角色 |
| 租户无法分配某菜单 | 检查租户套餐是否包含该菜单 |
| 修改菜单后仍旧异常 | 重新登录或刷新权限缓存,确认前端路由已重新拉取 |
