## 背景 `sys_user` 为 `managedBy:'better-auth'`,CRUD affordances 全关(ADR-0010:直接 ObjectQL 写入绕过哈希管线、不产 sys_account、破坏 session 一致性)。#2766 后所有写操作都有专用端点(create-user / set-user-password / import-users / ban 等),但**纯档案字段**(姓名等不碰凭据的列)的编辑仍不能走标准表单/data API,UI 一致性欠佳。 ## 评估内容(ADR 级决策,先 RFC 后实现) 1. 哪些字段可安全放开:候选 = `name`、`phone_number`、image 等档案列;**永不放开** = email(登录标识)、password/凭据、role/banned、全部 system-managed стamp 列(`password_changed_at`、`must_change_password`、`locked_until` 等)。 2. 机制:ObjectQL before-update hook 做字段白名单过滤 + 必要时委托 better-auth `internalAdapter.updateUser`(session 缓存一致性);还是仅放开 `edit` affordance + 字段级 readonly 控制。 3. 与 `/admin/import-users` upsert 的 `UPDATE_ALLOWED_FIELDS`(PR #2771)保持同一份白名单,避免两处漂移。 4. 审计:hook 路径天然被 plugin-audit 捕获(相对专用端点的显式审计是个优势)。 5. 风险面:放开写口子后 RLS/权限模型对 sys_user 行级更新的覆盖是否充分(谁能改谁的档案)。 产出:ADR + 决策;若通过,再立实现 issue。 ## 相关 - ADR-0010(身份表归 better-auth 管辖)、#2766 / PR #2771
Activity
docs(adr): ADR-0092 — sys_user profile-field editing via guarded engi…
os-zhuang commentedon Jul 11, 2026
RFC 评估完成,产出已全部落地,关闭本 issue:
docs/adr/0092-sys-user-profile-field-delegation.md):docs(adr): ADR-0092 — sys_user 档案字段经引擎 hook 委托,放开 edit affordance(RFC #2784) #2787 首版 → docs(adr): ADR-0092 修订 — D2 通用化为 registry 驱动的身份表写守卫 #2808 修订(D2 通用化为 registry 驱动的全家族身份表写守卫)→ docs(adr): ADR-0092 标记 Accepted,关联实现 issue #2816 / #2817 #2819 标记 Accepted。before{Insert,Update,Delete}守卫按managedBy: 'better-auth'对用户上下文写入 default-deny,唯一开口是按对象注册的 update 白名单(首条目sys_user → {name, image});守卫落地后才翻转userActions.edit(ADR-0049 时序);权限拓扑不变;与 import 白名单同源派生;会话缓存经 afterUpdate 失效。评估项 2 中"仅放开 affordance + 字段 readonly"被否决(服务端不强制 readonly,违反 ADR-0049);internalAdapter.updateUser委托因 adapter→engine 重入被否决。admin_full_access可裸写全部身份表的现存洞)→ feat(identity): ADR-0092 实现 B — sys_user 放开 edit affordance + 表单字段只读治理(依赖 #2816) #2817(affordance + 表单只读治理,依赖 feat(identity): ADR-0092 实现 A — 通用身份表写守卫(registry 驱动 default-deny + sys_user 档案白名单) #2816)。Generated by Claude Code