Skip to content

plugin-auth 的 databaseHooks 文档注释断言「better-auth 的适配器绕过 ObjectQL 中间件链」——已过时,今天 dataEngine 与 ql 是同一个实例 #4802

Description

@xuyushun441-sys

跨分片移交:Part of objectstack-ai/cloud#1022(cloud 侧的两处同源抄写由 cloud 分片 PM 自派,framework 这处原文本仓改不动,转入本队列)。

断言

packages/plugins/plugin-auth/src/auth-manager.tsdatabaseHooks 选项的文档注释:

better-auth fires these around its own adapter writes …, which the kernel-level ObjectQL middleware does NOT observe — better-auth's adapter goes through dataEngine directly, bypassing the ql.registerMiddleware chain.

对着 origin/main 逐跳核对,这句今天不成立

  1. packages/objectql/src/plugin.ts:243,245同一个 this.ql 被注册两次:registerService('objectql', this.ql)registerService('data', this.ql)(注释自己写着 "ObjectQL implements IDataEngine")。
  2. packages/plugins/plugin-auth/src/auth-plugin.ts:315const dataEngine = ctx.getService<IDataEngine>('data'),取到的就是同一个 ql
  3. packages/plugins/plugin-auth/src/objectql-adapter.ts:331,522 — 适配器写入是 await dataEngine.insert(objectName, …),没有任何 bypass 选项。
  4. packages/objectql/src/engine.tsinsert() 内部走 executeWithMiddleware(...),而 registerMiddleware() push 进的正是它 filter 的那个数组。

即:ql.registerMiddleware(fn, { object: 'sys_user' }) 在真实注册路径上触发。原始事故当年大概率属实,之后引擎/适配器演进把它抹平了,没人回来更新这段注释。

为什么值得修(不是注释洁癖)

这条断言被抄进了 cloud 的 AGENTS.md「血的教训」与 personal-org-hook.ts 文件头,是每个 agent 动手前会读的文字。cloud#1012 的两轮实现调研都因为它把「中间件路线」直接判死。一条过时的机制断言会持续生产错误的架构结论——这正是 AI 作者最难自查的那类错误:文档说得斩钉截铁,代码早就变了。

修法(结论保留,理由更换)

不要顺手改结论。「成员身份不该由 sys_user 中间件维护」今天依然对,但正当理由是 ADR-0093 D2:membership 不变量有唯一 owner(plugin-auth/reconcile-membership.ts,composed 进 user.create.after),每条创建路径各写一遍正是 D2 消灭掉的形态。所以把注释里的机制描述改成事实(中间件今天会触发),纪律(用 databaseHooks.user.create.after)保留,理由改挂 ADR-0093 D2。

实施前请对着当时的 HEAD 重跑上面那条逐跳核对——用一份别人两天前的核对结论去改文档,等于重演本单批评的错误。

关联

  • 来源:objectstack-ai/cloud#1022(cloud 侧两处抄写,已在 cloud 队列)
  • ADR-0093 D2

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

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions