## 背景 `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
背景
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 后实现)
name、phone_number、image 等档案列;永不放开 = email(登录标识)、password/凭据、role/banned、全部 system-managed стamp 列(password_changed_at、must_change_password、locked_until等)。internalAdapter.updateUser(session 缓存一致性);还是仅放开editaffordance + 字段级 readonly 控制。/admin/import-usersupsert 的UPDATE_ALLOWED_FIELDS(PR feat(auth): 管理员直建用户 + 手机号登录 + sys_user 批量导入(#2766 V1/V1.5/V2) #2771)保持同一份白名单,避免两处漂移。产出:ADR + 决策;若通过,再立实现 issue。
相关