Skip to content

showcase 的 cascading-select 用 'admin' in current_user.positions 收敛选项,而 admin 从来不在服务端的 positions 轴上(membership admin 被映射成 org_admin #15943

Description

@os-warren

现象

examples/app-showcase/src/data/objects/cascading-select.object.ts:85

visibleWhen: P`'admin' in current_user.positions`

收敛 tier 字段的 restricted 选项,且该文件的文档注释(:23-27)声称:

tier carries one ROLE-GATED option: restricted is offered only when 'admin' in current_user.positions. The same rule-validator rejects a non-admin who submits it anyway

'admin' 不是服务端 positions 轴上的名字。

实测

服务端 positions 由 resolveUserAuthzGrants 派生,membership 角色经 mapMembershipRole 规范化后才进入 positionspackages/core/src/security/resolve-authz-context.ts:821)。对着已构建的 packages/spec/dist/index.mjs 实测该函数:

"admin"        -> "org_admin"
"owner"        -> "org_owner"
"member"       -> "org_member"
"sales_manager"-> "sales_manager"

⇒ 一个 sys_member.role = 'admin' 的用户,服务端 positions 里是 org_admin没有 admin。而 positions.mdx:80-90 列出的内建名也只有 platform_admin / org_owner / org_admin / org_member —— 同样没有 admin。除非部署里恰好建了一条名为 adminsys_position 行,该谓词在服务端恒为假。

为什么这条独立于 #15136

方向相反,且是先前就存在的:

⚠️ 注意 #15136 落地后这条不会自愈,只是换了个形状:客户端也改用安全轴之后,两侧就一致地判假 —— 选项对所有人隐藏,而注释仍声称它对 admin 可见。

建议

二选一,择其一即可:

  1. 谓词改成 'org_admin' in current_user.positions(与内建名一致),或
  2. 在 showcase 的 seed 里建一条名为 adminsys_position 并做真实指派 —— 但那会让 showcase 示范一个与内建名极易混淆的岗位名,不推荐。

同时修正 :23-27 的注释,它目前断言了一个未成立的服务端行为。

出处

#15136 的 dev 席在做 current_user.positions 全仓普查时测到,顺路发现,未在该 PR 内修复(范围外)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions