Skip to content

[P0][security] Access 矩阵按 { packageId } 限定作用域 + 保存切片合并(ADR-0086 P0,生产上线阻断) #2221

Description

@os-zhuang

上线阻断项,来自 framework 授权全生命周期缺口地图 objectstack-ai/objectstack#2561(2026-07-04 优先级重排中由 P1 升 P0)。决策归属:framework docs/adr/0086-*(framework PR #2559)——本 issue 不重新决策,按 ADR-0086 P0 执行

问题(两个真实事故面)

#2196 落地的 Access 支柱把现有 PermissionMatrixEditPage 原样嵌入,当前行为(#2196 自己的验证记录可证:「matrix loads showcase_contributor (84 objects, granted counts)」):

  1. 「84 对象泄漏」:包上下文中打开的 Access 面板列出的是全环境所有对象的权限矩阵,而非本包声明的对象——管理员在包 A 的面板里能看到并误改不属于包 A 的授权(越权数据暴露面);
  2. 跨包授权数据丢失:保存把权限集整体覆写,其他包贡献的授权切片被一起冲掉(静默数据丢失陷阱)。

要做的(ADR-0086 P0 范围,勿扩)

  • Access 矩阵按 { packageId } 限定作用域:包上下文里只列当前包声明的对象;
  • 保存改为切片合并(slice-merge):只写回本包切片,不触碰其他包贡献的行;
  • 两个方向都要证明:本包编辑生效 其他包切片在保存后原样保留。

验收标准

  • 打开包 A 的 Access 面板只见包 A 声明的对象(不再是 84 个全环境对象);
  • 在包 A 的矩阵编辑并保存后,包 B 此前的授权行逐字节不变(写回归测试);
  • 浏览器实测完整闭环:打开 → 编辑 → 保存 → 重开,含对照另一包的切片留存检查;
  • type-check 0 errors,现有测试不回归。

协调点(重要)

framework 侧的 PermissionSetSchema.packageId + 每记录 managedBy 是 ADR-0086 P1(尚未落地,见 framework#2561)。若 UI 切片合并依赖记录级 packageId 才能实现,先确认能否用包 manifest 声明的对象清单做作用域(P0 最小实现);记录级来源轴等 framework P1 落地后再收紧。不确定时在本 issue 提问,不要自行改 framework 侧 schema

关联

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