Repository navigation
[umbrella][security] 授权全生命周期缺口地图 — 包开发 → 生产上线(P0–P3) #2561
Description
Activity
- added a commit that references this issue
on Jul 4, 2026 - addedpriority:p0Critical: blocker, must ship before MVPCritical: blocker, must ship before MVP
on Jul 4, 2026 - changed the title
[-][umbrella][security] Authorization lifecycle gap map — package development → production launch (P0–P3)[/-][+][umbrella][security] 授权全生命周期缺口地图 — 包开发 → 生产上线(P0–P3)[/+]on Jul 4, 2026 收尾进度补记(2026-07-04)
企业认证 P1/P2 — 已确认收尾,issue 正文已如实反映:
- P1(ADR-0069 D1–D3 + D7):
[x]已完成,feat(auth): last-login audit fields + ADR-0069 status (P1 completion) #2570 已合并(last-login 审计字段 + ADR-0069→Accepted)。 - P2(D4–D6):会话控制 + 全局 IP 白名单 + 多节点共享限流 store(feat(auth): shared cross-node rate-limit + session store via cache service (ADR-0069 D2) #2572 ✅ 已合并) 均已实现;ADR-0069 实现矩阵已把「shared multi-node rate-limit store」标为 landed。剩余缺口 = per-org/per-user
allowed_ip_ranges记录级字段 → [security][P2] Per-org / per-user IP allow-list (record-levelallowed_ip_ranges) — ADR-0069 D5 #2571,本次上线 deferred(多节点但非按租户锁 IP)。
P2「两道门分离」(ADR-0086 P2) — 框架侧已开发完成,评审中 #2573(草稿):
- 块1(包门):
publishMetaItem通用发布期物化器 → 已发布permission元数据物化进sys_permission_set(managed_by:'package'+package_id),复用既有sys_metadata草稿/发布流水线。 - 块2(管理门):数据层写门硬拒绝——管理门不能改/伪造
managed_by:'package'行;系统/开机写isSystem短路,物化器不自锁。 - 验证:单测(含数组伪造 / update 改badge / 无主体 / 精确批量)+ 真实 showcase 内核 dogfood(发布物化 + REST 管理门 403/200/伪造 403)全绿。
- objectui 侧(把包门实时保存改走
mode:'draft'+批量发布)为后续独立改动。
余下 P2/P3 纵深项不阻断上线。
Generated by Claude Code
- P1(ADR-0069 D1–D3 + D7):
- added a commit that references this issue
on Jul 4, 2026 ✅ P2「两道门分离」(ADR-0086 D6/D7)端到端完成并合并
框架 + objectui 两侧均已合并,两道门在各自 main 上闭环生效:
- framework#2573(已合并
9796e7c)—— P2 框架半边:- 块1 包门发布物化:
publishMetaItem通用发布期物化器 → 已发布permission元数据 upsert 进sys_permission_set(managed_by:'package'+package_id),与bootstrapDeclaredPermissions共用同一 upsert;publishPackageDrafts聚合物化结果。 - 块2 管理门数据层写门(硬拒绝):安全中间件拒绝管理门写/伪造
managed_by:'package'行(insert/update、单对象/数组),置于空主体 fall-open 之前(对超级用户亦成立);多行写仅在过滤命中包行时拒绝;系统/开机isSystem短路,物化器不自锁。
- 块1 包门发布物化:
- objectui#2225(已合并
d9f5ccd)—— P2 objectui 半边:- 包 Access 门(
/studio/:packageId/access)从"实时写活动记录"改为client.save(...,{mode:'draft',packageId})写草稿、随包 Publish 发布;草稿感知读(pending draft 覆盖已发布基线、侧栏合并 已发布 ∪ 草稿);env-admin 门保持 live;banner 从"保存即生效"改为"保存为草稿、发布后生效"。
- 包 Access 门(
闭环:包门编辑 → Save 写草稿 → 顶栏 Publish → 框架物化 → 数据层写门确保两道门各写各的。完全对齐 ADR-0086 TL;DR §1「populate and gate on the
managedByprovenance axis」。验证:framework 单测(物化语义 + 写门含数组/改badge/无主体/精确批量)+ 真实 showcase 内核 dogfood(发布物化 + REST 管理门 403/200);objectui scope 测试断言包门 save 携带
{mode:'draft',packageId}且保留他包切片;两侧 CI 全绿。
至此 #2561 上线地图的授权项收尾:P0(3)· P1(3)· P2 两道门(D6/D7)全部完成合并。 剩余为不阻断上线的纵深项:groups + 减法 muting(subtract 层,ADR 明确 deferred)、按操作
requiredPermissions、能力注册表、secure-by-default 推广、per-org IP(#2571,deferred)、SSO/合规(P3)。
Generated by Claude Code
- framework#2573(已合并
剩余任务评估 + 账本更正(2026-07-08 逐条复核代码后)
对剩余项按当前代码实况逐条核过,三处与清单不符,先更正:
-
P2「两道门分离」实际已完成 ——
assertPackageManagedWriteGate(plugin-security/src/security-plugin.ts:1055-1122,置于空主体 fall-open 之前)+permission发布物化器(security-plugin.ts:788)+ 单测(security-plugin.test.ts:946-1092)+ dogfood(two-doors-permission.dogfood.test.ts)均已在仓库。但上文评论引用的 PR feat(security): 权限集「两道门」分离 — 包门发布物化 + 管理门写门 (ADR-0086 P2) #2573 / commit9796e7c在本仓库历史中不存在;实际经 PR Showcase redesign: six-domain layout, registry-driven coverage, capability-map tour #2619(31faea1) 落地。建议勾选该项并更正引用。 -
能力注册表(D1)已是 PARTIAL,而非未动 ——
sys_capability对象(plugin-security/src/objects/sys-capability.object.ts)+ 向后兼容 seeding(bootstrap-system-capabilities.ts,挂kernel:ready)已落地。剩:systemPermissions/requiredPermissions由自由字符串→引用解析(permission.zod.ts:150、object.zod.ts:532仍是z.array(z.string()))+ ⑨ 授权/发布期 lint。 -
SSO(P3)比清单更完整 —— OIDC RP、SAML、SCIM 均已经由
@better-auth/sso/scim落地(auth-manager.ts:1463-1559),超出 ADR-0069 对 P3 的原始 defer。P3-SSO 实际只剩 settings-manifest 形式的信任列表 UI polish(现走sys_sso_provider记录 + action)。
其余项复核后的真实剩余:
- secure-by-default 推广(④):D2 原语已强制(
object.zod.ts:159-162;permission-evaluator.ts:66-77,183-206),但无一生产对象设access.default:'private',sys_secret/sys_sso_provider等敏感系统对象仍 public-by-default —— 纯 defaults + 可视化,剩余 P2 中价值最高;需先定"哪些对象转 private"(避免误伤运行时读取路径)。 - 按操作
requiredPermissions(⑤):未开始(object.zod.ts:532仍string[],security-plugin.ts:406-422对 CRUD 一刀切)。加性、向后兼容、边界清晰 —— 正在实现,单开 draft PR。 - groups + 减法 muting(⑦,落地时须覆盖 FLS/⑧)、per-org IP([security][P2] Per-org / per-user IP allow-list (record-level
allowed_ip_ranges) — ADR-0069 D5 #2571)+require_ip_match(D5):未开始,ADR 明确 deferred / evidence-gated。 - 诚意债(ADR-0049 "不留未强制的安全属性"):
agent.visibility([P2][security] Enforce agentvisibility(organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901,agent.zod.ts:172声明、runtime 零消费)与合规子系统 ×4(compliance / encryption / masking / rls-global,均 EXPERIMENTAL 无运行时消费)—— 应各自定"强制 or 移除",与本次上线正交但不宜长期悬置。
Generated by Claude Code
Generated by Claude Code
-
✅ P2 两项落地:按操作
requiredPermissions(⑤)+ 能力引用 lint(⑨)#2690 已合并(squash
466adf6,CI 16/16 全绿):- ⑤:对象
requiredPermissions支持string[](全 CRUD)或{read,create,update,delete}按操作映射(读开放/写门控);plugin-security 按操作强制,transfer/restore→update、purge→delete;数组形式语义不变(向后兼容)。 - ⑨:新
validateCapabilityReferences(@objectstack/lint)接入os validate/os lint——requiredPermissions引用一个"无处注册"的能力时授权期告警(打错如mange_users不再只有运行时静默 fail-closed)。内置能力表上移到 spec(security/capabilities.ts)作单一事实源,seeder 与 lint 共用。
正文待勾选:「按操作粒度的
requiredPermissions」→[x];「能力注册表」剩余仅 string→引用解析迁移(表+seeding+⑨ lint 均已落地)。下一项推进:secure-by-default 推广(④)。
Generated by Claude Code
- ⑤:对象
- added a commit that references this issue
on Jul 8, 2026 ✅ 本轮收尾:④ 合并 + 诚意债全部裁决(2026-07-08)
已合并:
- feat(platform-objects): secure-by-default posture for sensitive system objects (ADR-0066 ④) #2691(
9fa84f9)— ADR-0066 ④ secure-by-default 系统对象切片:sys_secret/sys_jwks/sys_verification/sys_oauth_access_token/sys_oauth_refresh_token/sys_device_code翻access.default:'private'(逐读取路径验证:better-auth adapter=isSystem、driver 级直读、空主体 fall-open 均不受影响);sys_scim_provider加 D3 能力门(镜像 sso);nav_jwks导航门;姿态由 platform-objects 测试 + D10 矩阵行secure-by-default-posture钉死。刻意排除成员自助对象(sys_session/sys_api_key/sys_oauth_application/sys_two_factor,Account app 以成员上下文经通用数据层读取)并有反向断言。④ 剩余:Studio 姿态可视化(objectui 侧)。
评审中(#2693,draft)— 诚意债裁决(ADR-0056 D8「强制 or 移除」):
- 移除 ×3(声明过、从未强制、无任何运行时消费):GDPR/HIPAA/PCI compliance configs、role-based data masking、全局 RLSConfig/RLSAuditEvent。合规级配置绝不能"看起来能用";FLS 是被强制的字段可见性路径;per-policy RLS 面不变。changeset 带 FROM→TO 迁移。
- 保留 ×1:字段静态加密(
EncryptionConfigSchema)—— 真实企业路线图项,继续[EXPERIMENTAL],保留决定记入矩阵。 - 标注 [P2][security] Enforce agent
visibility(organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901:agent.visibilityschema+编辑表单加[EXPERIMENTAL — NOT ENFORCED]横幅(核实:access/permissions已在 [P0][security] Agent access control is a no-op (permissions/visibility/access) #1884 强制,仅visibility未强制);矩阵新增agent-visibilityexperimental 行;待 listing 面具备 owner/org 语义后再强制。 - 矩阵四行处置全部落账;security/types/authorization 手写文档同步。
设计意见备案: #2571 per-org IP 组合语义 → 收紧/交集(不可放宽平台边界),见 #2571 评论。
至此本地图 framework 侧收敛: P0(3)+ P1(3)+ P2 核心(两道门、⑤、⑨、④系统对象切片、可观测性、共享限流)全部落地;D8 诚意债全部裁决(#2693)。剩余均为 deferred/evidence-gated(⑦ muting、#2571、委派管理、⑥ CEL 能力、SSO UI)或 objectui 侧(④ 可视化)。
Generated by Claude Code
- feat(platform-objects): secure-by-default posture for sensitive system objects (ADR-0066 ④) #2691(
✅ objectui 侧收尾:④ Studio 姿态可视化 + ⑤/⑨ 授权 UX 已合并(objectui#2350,
6eca471)- ④ 可视化(闭环 ADR-0066 ④ 的最后一块):Access 权限矩阵对
access.default:'private'对象行显示 Private 徽章 + "通配授权不覆盖"提示;对象设计器(metadata-admin 与 Studio 设置页共享)新增 Access 区块可编辑 posture,private 带发布前警示。 - ⑤ 编辑体验:对象级
requiredPermissions双模式控件(全部操作 / 按操作 read·create·update·delete),模式互转无损;per-op 切换对 bundled spec 特性探测(≥12.7 自动点亮)。 - ⑨ 进发布流:
usePublishAllDrafts发布前对待发布草稿跑validateCapabilityReferences(声明侧 = 已发布∪草稿权限集),告警 toast 呈现;规则特性探测 + 全异常吞掉,advisory、绝不阻断发布。 - en/zh i18n 齐备;CI 9/9 全绿(Test、Build & E2E、Bundle);590 用例回归通过。
至此 #2561 地图上 framework + objectui 两侧的可执行项全部收敛:剩余仅 deferred/evidence-gated(⑦ groups+muting、#2571 per-org IP、委派管理、⑥ CEL 能力面、SSO 信任列表 UI polish)与 #1901(等 agent listing 面具备 owner/org 语义)。
Generated by Claude Code
- ④ 可视化(闭环 ADR-0066 ④ 的最后一块):Access 权限矩阵对
- added a commit that references this issue
on Sep 28, 2026
概述
平台授权在整个生命周期上的全部已知缺口的总追踪 issue —— 覆盖包开发、分发安装、环境组合、运行时强制、生产/企业加固五个阶段。源自 #2557 / ADR-0086(PR #2559)工作中同步完成的全生命周期评估。
核心结论: 运行时强制层已相当扎实(约 18 个原语已强制,由 ADR-0056 D10 一致性矩阵在 CI 中守护)。缺口集中在两头——包开发端与生产/企业端。
P0 — 上线阻断(全部关闭 ✅)
transfer/restore/purge补 RBAC 门 —— 已合并(feat(security)!: secure-by-default requireAuth flip + RBAC gates for transfer/restore/purge (#2561 P0) #2562):三操作预映射到权限位 +modifyAllRecords旁路;审查中补齐行级防护(RLS 预镜像 / controlled-by-parent 覆盖破坏性操作类)。→ [security][立项位] M2 权限生命周期(undelete/purge)功能与 allowRestore/allowPurge RBAC 同批建设(evaluator 已 fail-closed,allowTransfer 已 enforced) #1883(开启追踪 M2 操作,本体仍 open){ packageId }限定作用域 + 保存切片合并;关闭「84 对象泄漏」+ 跨包数据丢失;带中途迁移守卫,对齐 framework feat(security): permission-set package provenance + bootstrapDeclaredPermissions (ADR-0086 P1) #2566 的记录级package_id。requireAuth安全默认翻转 —— 已合并(feat(security)!: secure-by-default requireAuth flip + RBAC gates for transfer/restore/purge (#2561 P0) #2562):specdefault(true)+ rest?? true,显式退出 boot warn;一致性矩阵requireAuth-default-flip→ enforced;浏览器实测 401/200/201 闭环;ObjectStackDefinitionSchema.api让 defineStack 层退出开关生效。→ ADR-0056 D2P1 — 高优先级(生产必需,全部落地 ✅)
PermissionSetSchema.packageId+ 每记录managedBy+sys_permission_set.package_id/managed_by列;bootstrapDeclaredPermissions播种stack.permissions(幂等/升级感知/不沾染环境行);一致性矩阵行declarative-permission-seeding+ dogfood 证明;关闭 ADR-0078 惰性违规。content/docs/concepts/authorization.mdx,九份 ADR 缝成单篇(六道强制门链 + 组合语义 + 包来源 + 生命周期五阶段 + CI 治理)。P2 — 模型完备性(6.5/7 ✅)
publishMetaItem通用物化器 → 已发布permission元数据 upsert 进sys_permission_set,managed_by:'package'+package_id);块2 管理门数据层写门硬拒绝(置于空主体 fall-open 之前,超级用户亦挡,isSystem短路不自锁);objectui 包 Access 门改mode:'draft'+ 随包 Publish 发布。单测 + showcase dogfood 全绿。→ ADR-0086 P2 / D6–D7(注:早期评论误引 feat(security): 权限集「两道门」分离 — 包门发布物化 + 管理门写门 (ADR-0086 P2) #2573/9796e7c,以 Showcase redesign: six-domain layout, registry-driven coverage, capability-map tour #2619/31faea1为准)requiredPermissions—— 已合并(feat(spec,security,lint): ADR-0066 authoring surface — per-operation requiredPermissions (⑤) + capability-reference lint (⑨) #2690):对象requiredPermissions支持string[](全 CRUD)或{read,create,update,delete}按操作映射;transfer/restore→update、purge→delete;数组形式语义不变(向后兼容)。→ ADR-0066 ⑤sys_capability对象 + 向后兼容 seeding、内置能力表上移 spec 单一真源、⑨ 授权/发布期 lintvalidateCapabilityReferences(feat(spec,security,lint): ADR-0066 authoring surface — per-operation requiredPermissions (⑤) + capability-reference lint (⑨) #2690);包级 capability 声明 API 带managed_by:'package'provenance(feat(spec,plugin-security): A5 — 包级 capability 声明 API (#2920) #2932,A5)。剩余仅systemPermissions/requiredPermissions的 string→引用解析迁移,随 ADR-0094 方向在 tracking(authz): 双轨赛道下的授权改进开发任务 v2(内核链 ADR 待编号 + 补齐轨 + 地基) #2920 语境推进。→ ADR-0066 D1/⑨sys_secret/sys_jwks/sys_verification/sys_oauth_*/sys_device_code翻access.default:'private'(成员自助对象刻意排除并有反向断言);sys_scim_providerD3 能力门;D10 矩阵行secure-by-default-posture钉死;Studio 姿态可视化 + Private 徽章 + 对象设计器 Access 区块(objectui#2350)。→ ADR-0066 D2/④allowed_ip_ranges([security][P2] Per-org / per-user IP allow-list (record-levelallowed_ip_ranges) — ADR-0069 D5 #2571)已于 2026-07-15 以「无业务需求」关闭(未实现,not planned),设计意见已备案待重开。resolvePermissionSets吞异常改为 fail-closed + warn 日志。→ [security][observability] resolvePermissionSets swallows dbLoader failures silently — custom permission sets vanish with no log #2565 ✅P3 — 企业 / 合规纵深(3/5 ✅)
visibility—— AI 专属项,仍未强制;refactor(spec): remove dead compliance subsystems (ADR-0056 D8) + mark agent visibility EXPERIMENTAL (#1901) #2693 已给 schema/编辑表单加[EXPERIMENTAL — NOT ENFORCED]标注 + 矩阵agent-visibilityexperimental 行(access/permissions已在 [P0][security] Agent access control is a no-op (permissions/visibility/access) #1884 强制,仅visibility未强制);强制待 agent listing 面具备 owner/org 语义(ADR-0095 B2 的 EXTERNAL posture 档位在铺路)。→ [P2][security] Enforce agentvisibility(organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901EncryptionConfigSchema)保留 ×1 继续[EXPERIMENTAL](真实路线图项);裁决全部记入 D10 矩阵。@better-auth/sso/scim落地(auth-manager.ts),超出 ADR-0069 对 P3 的原始 defer(原设想仅"SAML 评估、SCIM 立 ADR")。剩余仅 settings-manifest 形式的信任列表 UI polish(现走sys_sso_provider记录 + action,不阻断、暂无追踪 issue)。→ ADR-0069 P3current_user能力检查。→ ADR-0066 ⑥、ADR-0068EvalUser(注:explain 引擎 record 粒度扩展 feat(spec): C2-α — explain 契约扩展到 record 粒度 (#2920) #2928/feat(plugin-security): C2-β — explain 引擎 record 粒度行级归因 (#2920) #2939 是另一条线,不覆盖本项)依据来源 / 关联
packages/dogfood/test/authz-conformance.matrix.ts(ADR-0056 D10)visibility(organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901(P3,仍 open)、Design: authorization model — metadata vs environment-config boundary + cross-package composition #2557、[security][observability] resolvePermissionSets swallows dbLoader failures silently — custom permission sets vanish with no log #2565(fix(security): surface swallowed permission-set resolution failures (#2565) #2568 ✅)、[security] Anonymous posture inconsistent across surfaces: dispatcher /graphql and raw hono /data bypass requireAuth (/meta now gated) #2567(anonymous 门跨面一致性,仍 open——唯一未处理的关联安全缺口)、[security][P2] Per-org / per-user IP allow-list (record-levelallowed_ip_ranges) — ADR-0069 D5 #2571(per-org IP,2026-07-15 无业务需求关闭,not planned)、objectui#2221 / fix(objectql): findData 返回真实 total/hasMore (#2212) #2222(P0 ✅)visibility(organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901 标注)· objectui#2350(④ 可视化 + ⑤/⑨ 授权 UX)