Skip to content

plugin-auth 的两处审计注释断言「better-auth 写入绕过 plugin-audit 订阅的 ObjectQL 生命周期钩子」——同 #4802 一类的机制漂移,需核实 #4940

Description

@xuyushun441-sys

#4802databaseHooks 注释里「better-auth 适配器绕过 ql.registerMiddleware 链」已不成立)的核实过程中,发现同一包内另一条同类断言,落在不同的机制面上(生命周期钩子 / plugin-audit),与 #4802 的改动范围不重叠,按 Prime Directive #10 单独记录。

断言(两处同源抄写)

  • packages/plugins/plugin-auth/src/admin-user-endpoints.tswriteAdminAudit 上方):

    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.

  • packages/plugins/plugin-auth/src/admin-import-users.ts(run-level audit 上方):

    Run-level audit (better-auth writes bypass the ObjectQL hooks that plugin-audit subscribes to).

初步反证(对着 origin/main 6bc93dc

  1. packages/objectql/src/engine.tsinsert()triggerHooks('beforeInsert'/'afterInsert')executeWithMiddleware() 的 executor 内部执行;better-auth 适配器走的就是普通 dataEngine.insert(...)plugin-auth 的 databaseHooks 文档注释断言「better-auth 的适配器绕过 ObjectQL 中间件链」——已过时,今天 dataEngine 与 ql 是同一个实例 #4802 的逐跳核对已确认适配器与内核是同一个 ObjectQL 实例,且没有 bypass 选项)。
  2. packages/plugins/plugin-audit/src/audit-writers.tswriteAuditengine.registerHook('afterInsert', writeAudit, { packageId }) 注册,没有 object 过滤SKIP_OBJECTS 里有 sys_account / sys_session没有 sys_user
  3. 同包内已有反例:auth-plugin.ts 的 SCIM 身份来源印戳正是用 engine.registerHook('afterInsert', …) 去接 better-auth 适配器直写 sys_account 的那条路径——即注册在 ObjectQL 上的生命周期钩子对适配器写入确实会触发。

即:admin/create-user 创建 sys_user 时,plugin-audit 的 afterInsert 看起来是会跑的,那两条注释给出的理由("bypass 生命周期钩子")与 #4802 是同一类过时机制断言。

但结论不一定错——需要有人认真核一遍

显式审计行大概率仍然该留,只是理由不同,候选理由至少有三条,需要核实后择一写进注释:

  1. plugin-audit 是可选插件——admin 端点不能假定它装了;不装就真的没有合规痕迹。
  2. 元数据不同——显式行记录的是 action: 'create' | 'update' + admin actor + 结构化 metadata(以及 import 的 run-level 汇总),plugin-audit 的通用行记录的是逐行 diff,两者不是一回事。
  3. 可能反而是重复行——如果 plugin-audit 装了且钩子确实跑,sys_user 上是否已经在写第二条审计行?这是个独立的、值得量一量的问题。

建议做法

#4802 同款:保留纪律、更换理由,把注释改成核实后真实成立的那条,并指向代码位置;同时确认(或否认)第 3 点的重复行。

关联

未指派——记录的 finding,谁开工谁认领。

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions