Skip to content

权限诊断 ★ ​

一句话:权限诊断回答一个问题——「这个人为什么有 / 没有这个权限」。它把判定的全部中间结果摊开给你看:这个人的主体闭包(角色/岗位/部门继承链)、这个权限串的资源祖先链、链上每一条授权行、以及最终是哪一票决定了结果。排查权限问题的第一站,不用查库、不用看日志。

功能在哪 ​

  • 菜单路径:系统管理 → 组织权限 → 权限管理 → 权限诊断
  • 地址栏路由:/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(红)
命中动作✓ = 与本次诊断的动作匹配(* 也算匹配);✗ = 不匹配
有效期「已过期」红标 / 到期时间 / 永不过期
参与决策「生效(允)」绿 / 「生效(拒)」红 / 「不参与」灰

「参与决策」= 命中主体 且 命中动作 且 在有效期内,三者缺一不可。参与决策的行整行有底色(绿=放行,红=拒绝),扫一眼就能定位决定性的一票。

判定优先级(结论是怎么算出来的)

  1. 主体闭包为空 → 直接拒绝(不回落默认效果);
  2. 资源链为空 → 直接拒绝(严格模式);
  3. 筛出「主体命中 × 资源链上任一层 × 动作匹配(含 *)× 有效期内」的授权行;
  4. 一行都没有 → 回落到目标资源的默认效果;
  5. 有行 → 优先级 全局 DENY > 上下文 DENY > 上下文 ALLOW > 全局 ALLOW;
  6. 命中了行、但没有任何一行的效果是 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:可以填字段级资源的权限串来看功能判定,但字段显示模式(可编辑/只读/隐藏)是另一套合并逻辑(取最严格的上限),本页不展开。到权限资源该字段的「明细设计 → 授权列表」看「字段模式」列。