角色授权与默认页契约说明
查看文档来源信息
- 来源目录:
addons/sys_base/docs - 来源文件:
契约说明/角色授权与默认页契约说明.md
当前正式口径
- 超级管理员是用户级身份,不是
sys_authorities中的一条普通角色记录。 - 当前正式运行上下文只有两种:
role和super_admin。 selectedAuthorityId=0只在super_admin上下文下合法。- 角色授权正式以页面码、动作码、菜单标识和默认页页面码为准,不再以历史菜单树字段作为正式口径。
- 下游业务菜单授权必须基于当前模块已发布
system_menu,不再使用代码动作清单接口保存业务页面授权。 - 移动端/应用端菜单授权必须基于当前模块和当前应用范围已发布的
app_menu,并与 PCWEBsystem_menu授权相互独立。
关键字段口径
| 字段 | 含义 |
|---|---|
authorityId | 普通角色主键 ID |
accessMode | 当前运行上下文类型,正式取值为 role 或 super_admin |
selectedAuthorityId | 当前生效角色 ID;super_admin 上下文下固定为 0 |
pageCodes | 目标角色正式页面码列表 |
actionCodes | 目标角色正式动作码列表 |
menuFlags | 目标角色正式菜单标识列表,仅在已发布菜单授权中使用 |
defaultPageCode | 目标角色正式默认页页面码 |
defaultPage | 当前上下文默认页;PCWEB 默认页来自已发布 system_menu,应用菜单默认页来自已发布 app_menu |
appMenuDefaultPage | 当前 app-id 下命中 app_menu 授权后的应用端默认首页摘要 |
manageableAuthorityIds | 当前角色可管理角色范围 |
appScope | app_menu 生效应用范围,支持 all_apps、app_model_uuids、app_uuids、app_ids |
appScopeKey | 后端归一化后的 app_menu 应用范围键 |
运行规则
GET /sys_base/platform/manifest/getAuthorityCodeActionStatus由控制器内按当前上下文和可管理角色范围校验,不依赖外层 Casbin 先命中。- 当前会话读取自己当前生效角色的授权状态属于正式允许场景。
- 超级管理员用户可以读取任意普通角色授权状态,也可以读取
super_admin上下文状态。 - 普通角色读取其他角色授权状态时,目标角色必须落在自己可管理角色范围内。
GET /sys_base/platform/manifest/getPublishedMenuAuthorityStatus是下游业务菜单授权状态读取入口,数据源只来自当前模块已发布system_menu。POST /sys_base/platform/manifest/savePublishedMenuAuthority是下游业务菜单授权保存入口,保存前校验目标角色模块、已发布页面/菜单/动作存在性、默认页范围和操作者可下发范围。POST /sys_base/platform/manifest/saveAuthorityCodeActions只服务代码动作清单授权;调用方传入不属于代码动作清单的业务页面码时,必须提示改用savePublishedMenuAuthority。- 超级管理员上下文保存普通角色授权时,可以使用当前模块已发布菜单中的全部可见节点;没有发布菜单时不能生成兜底授权树。
- 普通角色保存目标角色授权时,选中的页面、菜单和动作必须仍落在自己当前角色已放行的菜单承载范围内。
defaultPageCode必须属于本次保存后的页面授权集合;保存完成后由后端同步修正目标角色默认页。POST /sys_base/platform/authority/copyAuthority复制角色时,仍按当前上下文对源角色、可管理角色范围、已发布菜单授权和默认页进行同口径校验,不能通过复制绕开正式授权边界。POST /sys_base/platform/manifest/getAppMenuAuthorityStatus是角色应用菜单授权状态读取入口,数据源只来自当前模块、当前应用范围已发布的app_menu。POST /sys_base/platform/manifest/saveAppMenuAuthority是角色应用菜单授权保存入口,保存结果写入sys_app_menu_authority_grants,不写入sys_authority_menus,不修改 PCWEB 默认页;保存后会重建该角色运行态 Casbin,把system_menu与app_menu已授权grantApis合并为统一接口权限。POST /sys_base/public/auth/getAppMenuAuthority是移动端/应用端运行态读取入口,按当前app-id匹配已发布app_menu后只返回当前上下文已授权的应用菜单结果。GET /sys_base/platform/user/getUserInfo在返回当前上下文时会附带appMenuDefaultPage,用于让调用方确认当前应用菜单默认首页是否已配置并授权;该字段不替代完整应用菜单权限接口。- 当
getUserInfo的 PCWEBsystem_menu默认页未解析,而当前应用菜单默认页已经明确解析成功时,defaultPage可返回同一个应用菜单默认页以兼容登录态默认页消费;该行为不构成从app_menu回退到system_menu,也不允许在未发布、未授权或未配置时生成默认页。
上下游约定
- PCWEB 登录和切换身份必须以
getUserInfo、asyncMenu、运行时权限状态和defaultPage为准。 - PCWEB 角色授权抽屉在
sys_base或明确代码动作清单场景下使用getAuthorityCodeActionStatus、saveAuthorityCodeActions。 - PCWEB 角色授权抽屉在下游业务模块下使用
getPublishedMenuAuthorityStatus、savePublishedMenuAuthority。 - PCWEB 角色授权抽屉的“应用菜单授权”页签使用
getAppMenuAuthorityStatus、saveAppMenuAuthority,用于配置移动端/应用端权限。 - 调用方可通过
getUserInfo.currentContext.appMenuDefaultPage或getUserInfo.appMenuDefaultPage判断当前应用菜单首页是否已配置;需要渲染应用端菜单和做页面/动作校验时必须继续使用getAppMenuAuthority。 - 移动端/应用端只消费
getAppMenuAuthority返回的pageCodes、actionCodes、menuFlags、tree和defaultPage,不能用 PCWEB 菜单权限推导应用菜单权限。 - 下游后端接口权限检查统一调用
checkPermission或 SDK 封装;授权来源可以是system_menu或app_menu,运行时放行结果只看当前角色 Casbin。 - 普通角色被正式拒绝时,应直接展示后端权限结果;不得把拒绝伪装成“前端不再请求”。
- 超级管理员被正式放行时,不得因外层 Casbin 预拦截而阻断页面初始化。
- 下游模块需要公共治理入口时,必须把入口随本模块
system_menu发布后再授权。
不允许的做法
- 不允许新增“超级管理员角色”替代超级管理员用户身份。
- 不允许用伪造
authorityId或伪造角色记录模拟super_admin。 - 不允许把超级管理员正式放行问题归因成“前端不要请求这个接口”后结束整改。
- 不允许让普通角色拿到超管能力,也不允许超管和普通角色一起被挡住。
- 不允许用
saveAuthorityCodeActions保存下游业务页面授权。 - 不允许无发布菜单时回退展示共享治理菜单或默认公共治理菜单。
- 不允许用
system_menu或sys_authority_menus结果代替移动端app_menu授权。 - 不允许
app_menu未发布、未匹配或未授权时回退到代码清单、历史app_model_menu或 PCWEB 系统菜单授权。
2026-04-24 联调补充口径
getAuthorityCodeActionStatus在super_admin模式下只允许超级管理员上下文读取;普通角色上下文即使账号本身是超管用户,也不得读取super_admin授权状态。- 角色授权页读取目标角色授权状态时,普通角色只能查看自身或可管理角色范围内的目标角色;超级管理员上下文可查看任意普通角色与
super_admin状态。 - 角色授权结果保存后,普通角色继续按正式页面码、动作码、默认页和可管理角色范围生效;超级管理员上下文不再受普通角色当前菜单承载范围误拦截。
2026-05-07 已发布菜单授权补充口径
- 下游模块角色授权页展示“已发布菜单授权”,授权树来自当前模块已发布
system_menu。 - 未发布
system_menu时,授权状态接口返回空树,前端展示“当前模块尚未发布菜单”。 saveAuthorityCodeActions的边界收窄为代码动作清单授权,不再承担下游业务菜单授权职责。- 默认页解析只接受已发布菜单中的已授权页面;无发布菜单、未授权或失效页面均按未配置处理。
2026-06-10 应用菜单授权补充口径
system_menu授权服务 PCWEB/后台导航、动作和默认页;app_menu授权服务移动端/应用端页面、动作和菜单树。- 两套菜单授权可以不同,保存、读取、菜单运行态消费和持久化表互相独立;但接口权限统一落到同一角色 Casbin 中。
app_menu授权必须带明确appScope,不同应用范围下同一角色的应用菜单权限互相隔离。- 移动端运行态按当前
app-id在已发布app_menu中匹配具体范围:具体应用 UUID、具体接入 AppID、应用模型、全部应用。 - 没有正式发布、没有命中应用范围或没有正式授权时,移动端返回空权限;不得回退到历史表或系统菜单权限。
- 接口运行态鉴权以 token 中当前
authorityId为准,checkPermission在 token、应用和上下文合法后只查角色 Casbin,不在每次请求时再查询sys_app_menu_authority_grants。
2026-06-24 用户资料接口应用菜单首页补充口径
getUserInfo返回的上下文列表会按当前app-id + addons-type + accessMode + authorityId解析应用菜单默认首页,并放入appMenuDefaultPage。appMenuDefaultPage.source=app_menu_authority_grant表示普通角色命中sys_app_menu_authority_grants中的默认页授权;source=super_admin_app_menu表示超级管理员上下文命中已发布app_menu默认页。appMenuDefaultPage只在已发布、已命中、已授权或超级管理员上下文可见时返回;否则为空,不返回default_page_unconfigured伪结果。defaultPage仍优先服务 PCWEB 登录与后台默认页;只有 PCWEB 默认页未解析且appMenuDefaultPage已解析时,才会复用应用菜单默认页,便于应用端当前上下文直接读取。