You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Best-effort explicit audit row. better-auth writes bypass the ObjectQL lifecycle hooks that plugin-audit subscribes to, so admin identity operations would otherwise leave no compliance trail.
在 #4802(
databaseHooks注释里「better-auth 适配器绕过ql.registerMiddleware链」已不成立)的核实过程中,发现同一包内另一条同类断言,落在不同的机制面上(生命周期钩子 / plugin-audit),与 #4802 的改动范围不重叠,按 Prime Directive #10 单独记录。断言(两处同源抄写)
packages/plugins/plugin-auth/src/admin-user-endpoints.ts(writeAdminAudit上方):packages/plugins/plugin-auth/src/admin-import-users.ts(run-level audit 上方):初步反证(对着
origin/main6bc93dc)packages/objectql/src/engine.ts—insert()的triggerHooks('beforeInsert'/'afterInsert')在executeWithMiddleware()的 executor 内部执行;better-auth 适配器走的就是普通dataEngine.insert(...)(plugin-auth 的databaseHooks文档注释断言「better-auth 的适配器绕过 ObjectQL 中间件链」——已过时,今天 dataEngine 与 ql 是同一个实例 #4802 的逐跳核对已确认适配器与内核是同一个 ObjectQL 实例,且没有 bypass 选项)。packages/plugins/plugin-audit/src/audit-writers.ts—writeAudit以engine.registerHook('afterInsert', writeAudit, { packageId })注册,没有 object 过滤;SKIP_OBJECTS里有sys_account/sys_session,没有sys_user。auth-plugin.ts的 SCIM 身份来源印戳正是用engine.registerHook('afterInsert', …)去接 better-auth 适配器直写sys_account的那条路径——即注册在 ObjectQL 上的生命周期钩子对适配器写入确实会触发。即:
admin/create-user创建sys_user时,plugin-audit 的afterInsert看起来是会跑的,那两条注释给出的理由("bypass 生命周期钩子")与 #4802 是同一类过时机制断言。但结论不一定错——需要有人认真核一遍
显式审计行大概率仍然该留,只是理由不同,候选理由至少有三条,需要核实后择一写进注释:
action: 'create' | 'update'+ admin actor + 结构化 metadata(以及 import 的 run-level 汇总),plugin-audit 的通用行记录的是逐行 diff,两者不是一回事。sys_user上是否已经在写第二条审计行?这是个独立的、值得量一量的问题。建议做法
与 #4802 同款:保留纪律、更换理由,把注释改成核实后真实成立的那条,并指向代码位置;同时确认(或否认)第 3 点的重复行。
关联
databaseHooks文档注释断言「better-auth 的适配器绕过 ObjectQL 中间件链」——已过时,今天 dataEngine 与 ql 是同一个实例 #4802(databaseHooks注释的同类漂移,已修)未指派——记录的 finding,谁开工谁认领。