Commit a47681b
committed
feat(auth): identity write guard — enforce managedBy:'better-auth' at the engine (#2816)
ADR-0092 D2/D3/D6 implementation:
- identity-write-guard.ts: before{Insert,Update,Delete} hooks (priority 10)
registered by plugin-auth at kernel:ready. User-context writes to any
object whose schema declares managedBy:'better-auth' are rejected
fail-closed (403 PERMISSION_DENIED with a pointer to the dedicated
surfaces); better-auth adapter (no context) and isSystem writes bypass.
Per-object update whitelist registry is the only opening; engine-stamped
lifecycle columns (updated_at/updated_by) pass through but never satisfy
the whitelist alone.
- sys-user-writable-fields.ts: shared field tiers — profile edit whitelist
{name, image} and the import superset {+phone_number, role}
(subset-by-construction, ADR-0092 D3); admin-import-users.ts now derives
UPDATE_ALLOWED_FIELDS from it.
- D6: afterUpdate hook mirrors better-auth's refreshUserSessions — cached
{session, user} snapshots in secondary storage are re-written (same TTL,
never deleted) with the changed profile fields after a guarded edit.
Verified against a live --fresh CRM backend: profile PATCH persists with
fresh updated_at; email-only PATCH 403s; role/must_change_password are
stripped and not persisted; insert/delete 403; create-user /
set-user-password / self-service update-user / import upsert all work
unchanged. Call-site sweep: every existing identity-table write already
runs under SYSTEM_CTX or the adapter path.
Closes #2816
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YGAN5VvvBi4YRGwpNT6e211 parent a823a95 commit a47681b
7 files changed
Lines changed: 694 additions & 2 deletions
File tree
- .changeset
- packages/plugins/plugin-auth/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
63 | | - | |
64 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
65 | 71 | | |
66 | 72 | | |
67 | 73 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
21 | 27 | | |
22 | 28 | | |
23 | 29 | | |
| |||
125 | 131 | | |
126 | 132 | | |
127 | 133 | | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
128 | 138 | | |
129 | 139 | | |
130 | 140 | | |
| |||
221 | 231 | | |
222 | 232 | | |
223 | 233 | | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
224 | 237 | | |
225 | 238 | | |
226 | 239 | | |
| |||
535 | 548 | | |
536 | 549 | | |
537 | 550 | | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
538 | 574 | | |
539 | 575 | | |
540 | 576 | | |
| |||
0 commit comments