现象
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 规范化后才进入 positions(packages/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。除非部署里恰好建了一条名为 admin 的 sys_position 行,该谓词在服务端恒为假。
方向相反,且是先前就存在的:
⚠️ 注意 #15136 落地后这条不会自愈,只是换了个形状:客户端也改用安全轴之后,两侧就一致地判假 —— 选项对所有人隐藏,而注释仍声称它对 admin 可见。
建议
二选一,择其一即可:
- 谓词改成
'org_admin' in current_user.positions(与内建名一致),或
- 在 showcase 的 seed 里建一条名为
admin 的 sys_position 并做真实指派 —— 但那会让 showcase 示范一个与内建名极易混淆的岗位名,不推荐。
同时修正 :23-27 的注释,它目前断言了一个未成立的服务端行为。
出处
由 #15136 的 dev 席在做 current_user.positions 全仓普查时测到,顺路发现,未在该 PR 内修复(范围外)。
现象
examples/app-showcase/src/data/objects/cascading-select.object.ts:85用收敛
tier字段的restricted选项,且该文件的文档注释(:23-27)声称:但
'admin'不是服务端positions轴上的名字。实测
服务端 positions 由
resolveUserAuthzGrants派生,membership 角色经mapMembershipRole规范化后才进入positions(packages/core/src/security/resolve-authz-context.ts:821)。对着已构建的packages/spec/dist/index.mjs实测该函数:⇒ 一个
sys_member.role = 'admin'的用户,服务端positions里是org_admin,没有admin。而positions.mdx:80-90列出的内建名也只有platform_admin/org_owner/org_admin/org_member—— 同样没有admin。除非部署里恰好建了一条名为admin的sys_position行,该谓词在服务端恒为假。为什么这条独立于 #15136
方向相反,且是先前就存在的:
positions装的是 better-auth 的user.role标量,若该标量是admin,选项显示;而服务端 rule-validator 按org_admin判,提交会被拒。建议
二选一,择其一即可:
'org_admin' in current_user.positions(与内建名一致),或admin的sys_position并做真实指派 —— 但那会让 showcase 示范一个与内建名极易混淆的岗位名,不推荐。同时修正
:23-27的注释,它目前断言了一个未成立的服务端行为。出处
由 #15136 的 dev 席在做
current_user.positions全仓普查时测到,顺路发现,未在该 PR 内修复(范围外)。