Skip to content

资源权限模型 ​

YeahBoot 将“前端是否展示”和“后端是否允许”分开表达,但最终角色授权与鉴权仍保持扁平。

资源类型 ​

所有资源保存在 sys_res:

值类型用途
1菜单左侧导航和视图层级
2页面具体路由页面
3按钮前端操作展示控制
4接口后端 @PreAuthorize 鉴权
5分组视图授权树中的辅助分组

接口管理还使用 sys_res_group 建立独立分组树。它只帮助管理接口资源,不直接参与鉴权。

权限标识约定 ​

text
view:admin:sysUser:create
api:admin:sysUser:create
  • view::前端视图资源标识。
  • 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,否则同一接口的多个展示位置会联动。

状态生效 ​

  • 禁用角色:该角色不再参与当前用户权限查询。
  • 禁用资源:该权限不再参与鉴权和前端有效资源树。
  • 删除资源:删除或阻断对应角色关联与挂载关系,避免悬挂授权。
  • 修改挂载关系:相关角色授权必须同步清理已失效挂载,避免界面和实际权限不一致。

权限设计步骤 ​

新增一个操作时建议按顺序执行:

  1. 在后端接口添加明确的 api: 权限标识。
  2. 在资源管理中创建接口资源。
  3. 如需前端显示控制,创建对应 view: 按钮资源。
  4. 将接口资源挂载到视图资源。
  5. 在角色授权中同时勾选视图节点和需要的接口节点。
  6. 用普通角色验证:按钮是否隐藏、直接请求是否返回 403。

不需要前端控制的后台接口可以独立授权,不强制创建同名按钮资源。

YeahBoot 官方技术文档