feat(gateway): 多租户增量2 —— gorm 租户插件按上下文自动隔离查询(SaaS P1)
统一强制、别靠人肉:受租户模型标记 isTenantScoped() 后,store/tenant_scope.go 的 gorm 回调按请求 ctx 自动给查询加 WHERE tenant_id、创建自动填 tenant_id。 - KB / Agent 加 TenantID 字段 + isTenantScoped() 标记 - middleware.TenantContext 把 tenant 注入 request context 供 store 插件读取 - ctx 无租户(系统/回填/未登录)不过滤,保留跨租户操作能力 - 启动 BackfillRowTenants 回填存量行 tenant_id=owner 默认租户(幂等) live 验证:创建自动写 tenant_id ✓;同 owner 不同 tenant 的行被查询过滤 ✓。 Doc/DocLink(异步入库)、Task/Eval(无 owner)留待增量2b。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+6
-1
@@ -164,7 +164,12 @@ RBAC 未做,暂以单管理员账号代理;概览口径必须是**系统级*
|
||||
> 2026-07-06 用户定方向:真·多租户商业化 + 桌面端仍主产品(非Web-first)。按 SAAS_DESIGN.md P1 分阶段。
|
||||
- [x] **增量1:租户身份地基**✅(693a8f0)—— Tenant/TenantMember 表 + 注册建默认租户 + 存量回填 +
|
||||
TenantContext 中间件注入 tenant_id + GET /tenants/current。live 验证。**未动查询隔离。**
|
||||
- [ ] 增量2:核心表加 tenant_id + 统一 gorm scope 强制隔离 + 存量行回填 + 重写查询(PG 先行)| L
|
||||
- [x] **增量2:查询隔离机制(gorm 租户插件)**✅ —— KB/Agent 加 tenant_id + `isTenantScoped()` 标记;
|
||||
`store/tenant_scope.go` gorm 回调按请求 ctx **自动**给受租户表查询加 `WHERE tenant_id`、创建自动填
|
||||
(统一强制、别靠人肉);ctx 无租户(系统/回填)则不过滤;中间件把 tenant 注入 request ctx;启动回填存量行。
|
||||
live 验证:创建自动写 tenant_id ✓;**同 owner 不同 tenant 的行被查询过滤掉** ✓(隔离机制生效)。
|
||||
Doc/DocLink(异步入库)、Task/Eval(无 owner,待提交链改造) 下一增量铺开。
|
||||
- [ ] 增量2b:Doc/DocLink 走异步 JetStream 入库,tenant 需随 job payload 传播;Task/Eval 补 owner+tenant | M
|
||||
- [ ] Redis/MinIO/Milvus/Neo4j 的 tenant 前缀/namespace | M
|
||||
- [ ] 真正的 RBAC:User 加 role 字段 + 角色/权限表,`RequireAdmin`(middleware/auth.go:46) 从白名单升级为角色校验 | M
|
||||
- [ ] 用户管理接口:列举 / 禁用 / 改角色(现仅注册/登录/查我,handler/auth.go)| M
|
||||
|
||||
Reference in New Issue
Block a user