权限诊断 ★
一句话:权限诊断回答一个问题——「这个人为什么有 / 没有这个权限」。它把判定的全部中间结果摊开给你看:这个人的主体闭包(角色/岗位/部门继承链)、这个权限串的资源祖先链、链上每一条授权行、以及最终是哪一票决定了结果。排查权限问题的第一站,不用查库、不用看日志。
功能在哪
- 菜单路径:系统管理 → 组织权限 → 权限管理 → 权限诊断
- 地址栏路由:
/system/org-permission/perm/permission-diag - 需要权限:
system:permission-diag:query
未诊断时页面下方是一段引导空态;诊断完,结果区四块依次出现。

界面认识
| 区域 | 内容 |
|---|---|
| 查询区 | 权限标识(可搜索下拉,也允许直接输入)/ 动作(13 项全量词表)/ 用户(不选=当前用户)/「诊断」按钮 |
| 结论 | 一条彩色横条:✅ 有权限(绿)或 🚫 无权限(红),后面跟一句判定理由 |
| 主体闭包 | 标题「主体闭包(用户 N 的角色/身份继承链)」,下面一排灰色标签 |
| 资源链 | 表格:深度 / 名称 / 权限标识 / 类型 / 默认效果,从最具体到根 |
| 授权行 | 表格:ID / 主体 / 动作 / 效果 / 命中动作 / 有效期 / 参与决策,绿底红底标出参与决策的行 |
三个查询条件怎么填
| 条件 | 怎么填 | 注意 |
|---|---|---|
| 权限标识 | 点开下拉搜(选项格式 system:user:query(用户查询)),或直接输入后按回车 | 输入完直接点「诊断」会弹「请输入权限标识」——见下面的提示 |
| 动作 | 默认「查看」;排查流程权限时改成 发起 / 设计 / 管理 / 查看全部 | 下拉旁有个 ⓘ 图标,悬停能看动作词表说明 |
| 用户 | 不选就是诊断你自己;要查别人就从下拉里选(格式 昵称(用户名)) | 选错人是最常见的误判来源,诊断前先确认 |
权限标识那一格是「可选可输」的下拉
它刻意做成 allow-create:诊断本来就可能要查一个还没建资源行的权限串。代价是——光打字不提交,值不会进表单。打完请按 回车(回车同时会触发诊断),或者从下拉里点选一项。
更推荐从下拉里选:权限串格式严格,手打错一个字符会诊断出「资源表里没有该权限标识」,而那和「确实没权限」在结果页上长得很像,非常容易误判。
动作下拉给的是全量词表,不分「生效/预留」两组
这是刻意的:预留动作也要能选,才能实测出「配了确实不生效」。授权表单里那些动作被收进「预留动作(配了不生效)」分组,诊断页不做这个区分。
结果怎么读
第一块:结论
只有两种:✅ 有权限 / 🚫 无权限,后面那句理由直接告诉你判决依据:
| 理由文案 | 含义 | 下一步 |
|---|---|---|
没有命中任何有效授权,回落到资源的 default_effect=拒绝 | 链上一条能用的授权都没有,按资源的默认效果兜底(默认拒绝=没权限) | 去角色资源授权给对应角色加一条 ALLOW |
没有命中任何有效授权,回落到资源的 default_effect=允许 | 同样没命中授权,但这类资源默认放行(数据集/列/字段) | 通常不用管;要收紧就显式配 DENY |
存在有效的 ALLOW 授权(id=…) | 有生效的放行授权,括号里就是那条授权的 ID | 拿 ID 去授权列表核对 |
存在有效的 DENY 授权(id=…),DENY 优先级高于所有 ALLOW | 有人显式拒绝了,且拒绝压过一切允许 | 拿 ID 找到那条 DENY,确认是不是该留 |
资源表里没有 permission=… 的记录(严格模式:找不到资源 = 无权限) | 权限串没登记成资源,或打错了 | 去权限资源核对这个串在不在 |
两种「无权限」的处理方向完全不同
回落到默认效果 = 没人配过,去加授权;被 DENY 命中 = 有人配过拒绝,去查那条拒绝该不该留。看结论那一句就能分开,别一律去加授权——加一条 ALLOW 压不掉 DENY。
第二块:主体闭包
一排标签,形如 USER:90000050014、ROLE:9000000590、ALL:all-users,是这个用户参与判定的全部身份:他自己、他的角色,以及继承来的岗位/部门/用户组等。判定只认这排标签里的主体——授权行的主体不在这里,就等于跟他无关。
- 少了预期的角色 ⟹ 用户没挂那个角色,去用户管理「分配角色」;
- 空态文案「该用户没有任何主体(没有角色,或主体闭包为空)」⟹ 没有身份就没有权限,此时直接拒绝,连默认效果都不回落。
第三块:资源链
从最具体到根,一行一层。「深度」列写的是 目标、↑1级、↑2级……它决定继承哪些父资源的授权:链上任何一层的授权行都参与判定,这就是「给分类授权,其下流程自动继承」「上级菜单配了拒绝,子操作也进不去」的机制。
| 列 | 读法 |
|---|---|
| 深度 | 目标 是你查的那条;↑N级 是它的第 N 层祖先 |
| 名称 / 权限标识 | 目录层没有权限串,显示「(目录层,无权限标识)」 |
| 类型 | 菜单 / 操作 / 流程 / 分类 / 数据集 / 列 / 字段 |
| 默认效果 | 允许(绿)/ 拒绝(灰)。只有「目标」那一行的默认效果会被用作兜底,祖先的默认效果不参与回落 |
空态文案「资源表里没有该权限标识,严格模式下等同于无权限」,与结论里的说法是同一件事。
第四块:授权行
链上全部 sys_grant 行(不只是命中的),一行一条。这块是找「明明配了却不生效」的地方:
| 列 | 读法 |
|---|---|
| ID | 授权行编号,可直接拿去授权列表定位 |
| 主体 | 类型:编号,命中主体闭包时后面挂绿标「命中主体」 |
| 动作 | 该行的动作(含 * 全部动作) |
| 效果 | ALLOW(绿)/ DENY(红) |
| 命中动作 | ✓ = 与本次诊断的动作匹配(* 也算匹配);✗ = 不匹配 |
| 有效期 | 「已过期」红标 / 到期时间 / 永不过期 |
| 参与决策 | 「生效(允)」绿 / 「生效(拒)」红 / 「不参与」灰 |
「参与决策」= 命中主体 且 命中动作 且 在有效期内,三者缺一不可。参与决策的行整行有底色(绿=放行,红=拒绝),扫一眼就能定位决定性的一票。
判定优先级(结论是怎么算出来的)
- 主体闭包为空 → 直接拒绝(不回落默认效果);
- 资源链为空 → 直接拒绝(严格模式);
- 筛出「主体命中 × 资源链上任一层 × 动作匹配(含
*)× 有效期内」的授权行; - 一行都没有 → 回落到目标资源的默认效果;
- 有行 → 优先级 全局 DENY > 上下文 DENY > 上下文 ALLOW > 全局 ALLOW;
- 命中了行、但没有任何一行的效果是 ALLOW 或 DENY(脏值)→ 静默拒绝。
第 5 条解释了为什么「加一条 ALLOW 没用」:链上只要有一条 DENY 命中,ALLOW 再多少条也压不过它。
常用排查配方
| 症状 | 怎么诊断 |
|---|---|
| 用户说「菜单看不见」 | 权限标识填那个菜单/按钮的串(从下拉选),动作「查看」,用户选他 → 看结论与授权行 |
| 用户说「按钮点不了 / 403」 | 同上,权限标识填按钮的串(如 system:user:create) |
| 「我明明配了授权,还是不生效」 | 看授权行表的参与决策列:灰「不参与」就逐列查——主体没命中?动作没匹配(配的是预留动作)?已过期? |
| 流程发起/管理相关权限 | 动作换成 发起 / 设计 / 管理 / 查看全部;权限标识填流程或分类的串(给分类授权会沿链继承给其下流程) |
| 想验证「预留动作配了确实不生效」 | 动作直接选一个预留动作(如「导出」)跑一次,结论会是无权限 |
| 数据能进页面但一行都看不到 | 那是行级过滤,不在本页判定范围内——去权限资源该数据集的「明细设计 → 槽位映射」核对槽位,本页只回答功能权限 |
视角对照
| 视角 | 看到什么 |
|---|---|
| 超管 / 租户管理员 | 全功能;用户下拉里能选到可管理的用户,也能不选(诊断自己)。本页截图即租户管理员视角 |
有 system:permission-diag:query 的运维角色 | 同样能诊断任意可见用户——这个权限本身很敏感,别随手发 |
| 无该权限的角色 | 菜单不出现,直达 403 |
诊断结果是「此刻」的快照
判定读的是当前库里的授权与有效期。刚改完授权再诊断,看到的是改后的结果;要复现用户当时的处境,注意授权行的到期时间是否已经变化。
进阶
常见问题
Q:点「诊断」弹「请输入权限标识」,可我明明打了字? A:那一格是可搜索下拉,打字只填了搜索框、没提交成值。按回车(会同时触发诊断),或从下拉里点选一项。
Q:结论是「无权限」,但用户在页面上明明能操作? A:三个可能——① 诊断的动作选错了(页面走的可能是另一个动作码);② 用户当时用的是另一个账号;③ 那条权限走的不是这套资源判定(如超管的 *:*:* 通配)。先核对动作与用户。
Q:授权行表里一条行都没有? A:空态写的是「资源链上没有任何授权行」——链上(含所有祖先层)压根没人配过。此时结论必然回落到目标资源的默认效果。
Q:有一条 ALLOW 命中了,结论却还是无权限? A:往上找红底行——链上有 DENY,DENY 优先级高于所有 ALLOW。结论那句会写成「存在有效的 DENY 授权(id=…)」。
Q:主体闭包里没有预期的角色? A:那个用户没挂该角色(或角色被停用)。到用户管理给他「分配角色」,再回来重新诊断。
Q:资源链显示为空 / 结论说「资源表里没有该权限标识」? A:权限串打错了,或这个串还没登记成资源行。严格模式下「找不到资源 = 无权限」,这是设计如此(宁可拒绝,不可放过一个没登记的权限点)。到权限资源搜一下这个串。
Q:能诊断字段级权限(某列为什么看不见)吗? A:可以填字段级资源的权限串来看功能判定,但字段显示模式(可编辑/只读/隐藏)是另一套合并逻辑(取最严格的上限),本页不展开。到权限资源该字段的「明细设计 → 授权列表」看「字段模式」列。
