Skip to content

Package uninstall does not clean up data-plane permission rows by package_id (ADR-0086 D3 wiring gap) #2747

Description

@os-zhuang

问题

DELETE /api/v1/packages/:id 的卸载路径(SchemaRegistry.uninstallPackage + MetadataProtocol.deletePackage)只删除 sys_metadata 覆盖行和 sys_packages 持久化记录——没有任何按 package_id 清理数据面权限行的逻辑:

  • sys_permission_setmanaged_by:'package'package_id = <被卸载包> 的行不会被删除;
  • 指向这些权限集的 sys_position_permission_set / sys_user_permission_set 绑定行也原样保留。

ADR-0086 D3 引入 package_id/managed_by 溯源列正是为了让卸载语义可定义(sys-permission-set.object.ts 里的 package_id 索引注释也写明是"for the uninstall/upgrade query"),但消费这条索引做删除的接线目前不存在。ADR-0090 D5 也明确要求:"uninstalling the package (removing its sets by packageId, ADR-0086 D3) revokes it everywhere at once. No ghost grants." 当前实现达不到这一点——卸载后授权继续生效(ghost grants),直到有人手工清理。

复现

  1. 运行时安装一个带 permissions 声明的包(或声明在 stack 里,启动 seeder 落库);
  2. 确认 sys_permission_set 出现 managed_by:'package' 的行,并给某岗位绑定该权限集;
  3. DELETE /api/v1/packages/:id 卸载;
  4. sys_permission_set / sys_position_permission_set 行仍在,持有者权限不变。

期望

卸载时按 package_id 删除该包的权限集行及其绑定(级联或先删绑定),使授权立刻全局失效。plugin-security 需要一个卸载钩子(目前完全没有 uninstall 处理器),或由 protocol 的 deletePackage 发出事件供 plugin-security 消费。

备注

🤖 Generated with Claude Code

https://claude.ai/code/session_01DP13MuGwFWLcVxVtuA7rgq

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