Skip to content

[access-decide-granularity] decide API 粒度无法区分同一 permission 下不同 route gate (PR #2300 F2) #2335

Open

Description

@ghbvf

现状

POST /api/v1/access/decide(http.auth.decide.v1,#1863/BR-004)的请求体只携带 action + 可选 resource,前端 <Can> 组件据此问「当前用户可否执行 」。

  • 证据:contracts/http/auth/decide/v1/request.schema.json:6(request 仅 action/resource);corecells/accesscore/.../identitymanage:PermUserWrite 同时用于 auth.RequirePermission(...) 的 admin-only gate 与 auth.RequirePermissionForResource("id", ...) 的 owner-scoped gate。
  • 三维根因:
    • 代码:permission 是 coarse action,不是 route/operation identity;同一 permission 可挂在不同形状的 route gate 上。
    • 架构:decide API 把 PDP 当作「真实 route gate 的精确 oracle」,但 PDP 只回答 coarse/owner 级 permission 问题,二者不等价(系统性:PermUserWrite 至少同时服务 admin-only 与 owner-scoped 两类 gate)。
    • 历史:对标 Cedar(principal/action/resource/context 建模)、OPA Envoy(HTTP method/path/body 真实请求上下文)、Spring Security AuthorizationManager<T>(针对具体 object 授权)——业界 decide 输入都比 coarse action 更具体。
  • 影响范围:
    • 直接:前端按 user:write + self resource 可能得 allowed=true,但对应按钮若调用 create/delete/lock/unlock 等 admin-only route,实际仍 403——授权 UI 与后端实际 403 分裂。
    • 间接:任何「同一 permission 覆盖多形状 route gate」的端点都有同样误判面。
    • 同类:PermUserWrite(admin-only + owner-scoped)已确认;其余混合 permission 需 Grep 复核。

修复方向

三级方案种子(review F2 详表):

  • 最小:在 request.schema.json / contract.yaml 显式声明 decide 只回答 coarse/owner 决策,前端不得用它推断 admin-only operation(纯文档/契约约束,不改 wire 语义)。
  • 彻底:request 增加 operation / contractId,按真实 route gate(method+path+对应 permission/owner 形状)决策,使 decide 输出与实际 403 等价。
  • 重构:拆分混合 permission(如 owner write 与 admin account-management 分离),让每个 permission 对应单一 route gate 形状,从根上消除「一 permission 多形状」歧义。

注:方案涉及 wire contract 破坏式变更(pre-GA 窗口内可原地改 active 版本,但须完成契约扇出闭环 + PR 说明动机),且「拆分混合 permission」牵动现有 gate 接线,属设计级(Cx4),需人工裁决方案档位。

Files

  • contracts/http/auth/decide/v1/request.schema.json:6
  • contracts/http/auth/decide/v1/contract.yaml
  • corecells/accesscore/slices/authorizationdecide/handler.go
  • corecells/accesscore/slices/identitymanage/(PermUserWrite 双形状 gate)

Source

PR #2300 finding F2 · Discovered via /fix #2300(关联 epic #1863;review 裁决 Cx4 需人工决策,用户裁决:只建 backlog issue,本 PR 不动 decide 契约)

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-auth认证 Authn + 授权 AuthzbacklogBacklog item — automation trigger 入 projectcx-4Cx4 改动量:≥15 文件/≥3 领域 或 架构改造pri-p2Priority P2type-arch-opt架构优化

    Projects

    • Status
      Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions