资源权限模型
YeahBoot 将“前端是否展示”和“后端是否允许”分开表达,但最终角色授权与鉴权仍保持扁平。
资源类型
所有资源保存在 sys_res:
| 值 | 类型 | 用途 |
|---|---|---|
| 1 | 菜单 | 左侧导航和视图层级 |
| 2 | 页面 | 具体路由页面 |
| 3 | 按钮 | 前端操作展示控制 |
| 4 | 接口 | 后端 @PreAuthorize 鉴权 |
| 5 | 分组 | 视图授权树中的辅助分组 |
接口管理还使用 sys_res_group 建立独立分组树。它只帮助管理接口资源,不直接参与鉴权。
权限标识约定
text
view:admin:sysUser:create
api:admin:sysUser:createview::前端视图资源标识。api::后端接口资源标识。- 前缀是命名约定,不改变鉴权算法。
- 权限标识必须全局唯一、稳定,不应随显示名称修改。
前端只根据 view: 控制按钮等界面元素;接口调用本身不因为前端缺少权限而跳过,后端通过 api: 权限作最终判断。
管理分层
资源管理页面分为两个 Tab:
- 视图资源:维护菜单、页面、按钮和辅助分组。
- 接口资源:按接口分组树维护接口权限。
接口资源不依赖 parent_id 挂在视图树下,而是通过 sys_res_mount 多对多挂载:
text
用户管理页面
├── 新增用户按钮
│ └── 挂载:新增用户接口
└── 重置密码按钮
└── 挂载:重置密码接口同一个接口可以挂载到多个视图节点;解除某一处挂载不会删除接口资源本身。
角色授权
授权树查询时,后端读取视图树、接口资源和挂载关系,并把接口节点动态放入对应视图节点的 children。返回节点包含资源类型;接口挂载节点还包含 mountId。
提交授权使用:
json
{
"roleId": 2,
"viewResIds": [100, 101, 1102],
"mountIds": [501, 502]
}viewResIds:菜单、页面、按钮和分组等视图资源 ID。mountIds:具体接口挂载位置 ID。
后端通过挂载记录解析真实接口 resId,写入 sys_role_res 时按业务键处理重复。鉴权仍使用接口资源 ID 和权限字符串,而不是使用 mountId。
这样可以同时满足:
- 同一接口在多个位置分别显示勾选状态。
- 一个接口授权一次即可通过后端鉴权。
- 取消某个挂载位置不会误判其他位置的界面状态。
全选与半选
角色授权树允许父子联动。提交时保留当前产品约定:全选节点和半选节点都可以进入授权集合,以保证菜单祖先和下级页面路径可见。
多对多接口节点的唯一前端 Key 必须包含挂载关系,不能只使用接口资源 ID,否则同一接口的多个展示位置会联动。
状态生效
- 禁用角色:该角色不再参与当前用户权限查询。
- 禁用资源:该权限不再参与鉴权和前端有效资源树。
- 删除资源:删除或阻断对应角色关联与挂载关系,避免悬挂授权。
- 修改挂载关系:相关角色授权必须同步清理已失效挂载,避免界面和实际权限不一致。
权限设计步骤
新增一个操作时建议按顺序执行:
- 在后端接口添加明确的
api:权限标识。 - 在资源管理中创建接口资源。
- 如需前端显示控制,创建对应
view:按钮资源。 - 将接口资源挂载到视图资源。
- 在角色授权中同时勾选视图节点和需要的接口节点。
- 用普通角色验证:按钮是否隐藏、直接请求是否返回 403。
不需要前端控制的后台接口可以独立授权,不强制创建同名按钮资源。