chore(backend): 治理文件补充 SaaS 多租户指针与硬约束

This commit is contained in:
zhoulei
2026-08-20 10:41:10 +08:00
parent 17912ea8a7
commit cded6787f4
3 changed files with 17 additions and 0 deletions
@@ -52,6 +52,12 @@
- 不为不可能发生的情况加 fallback。 - 不为不可能发生的情况加 fallback。
- 不引入向后兼容 shim,除非用户明确要求。 - 不引入向后兼容 shim,除非用户明确要求。
### B7. 多租户隔离(SaaS 硬约束)
- 任何数据访问(JPA / 原生 SQL / 编排)必须带 `tenant_id` 过滤;缓存 key 必须前缀 `tenant:{tenantId}:`
- 租户标识以 token 为准,禁止在业务参数 / URL 中传递 tenantId;跨租户操作须 `@CrossTenant` + 审批。
- 前端:品牌/主题/菜单须按 `tenantConfig` 动态加载,禁止硬编码;`X-Tenant-Id` 头由 `request.ts` 自动附加,业务代码不得手写。
- 详细设计与落地映射见 `docs/architecture.md §7``coding-standards.md §9`;本仓库 `ARCHITECTURE.md §10`
### B6. 实施日志(execution log ### B6. 实施日志(execution log
- **每完成一个可独立验收的部分(milestone 或子任务),必须在 `.project.agents/log` 写日志**。格式与时机见 `VIBECODING_GUIDE` - **每完成一个可独立验收的部分(milestone 或子任务),必须在 `.project.agents/log` 写日志**。格式与时机见 `VIBECODING_GUIDE`
- 日志内必须包含本段的版本控制提交列表;若本段未提交,明确写出"未提交"及原因。 - 日志内必须包含本段的版本控制提交列表;若本段未提交,明确写出"未提交"及原因。
@@ -31,6 +31,7 @@
- I2. 原生 SQL 全量 `?` 参数化,禁止字符串拼接。 - I2. 原生 SQL 全量 `?` 参数化,禁止字符串拼接。
- I3. 分层依赖单向:api/controller → esb/wsi → {pi/impl, repository} → dao;禁止反向依赖。 - I3. 分层依赖单向:api/controller → esb/wsi → {pi/impl, repository} → dao;禁止反向依赖。
- I4. Controller 直接 return 业务对象,禁止手拼统一响应体。 - I4. Controller 直接 return 业务对象,禁止手拼统一响应体。
- I5. 多租户隔离:所有数据访问必须带 `tenant_id` 过滤(JPA @Filter / Repository 基类 / 原生 SQL `?`),缓存 key 前缀 `tenant:{tenantId}:`;跨租户操作须 `@CrossTenant` + 审批。详见 `../../../../docs/architecture.md §7``coding-standards.md §9`
## 2. 模块清单 ## 2. 模块清单
@@ -176,3 +177,12 @@ src/main/resources/
- 加/删模块或改依赖方向 → 改本文 §2 + §3,同一 commit。 - 加/删模块或改依赖方向 → 改本文 §2 + §3,同一 commit。
- 改对外签名 → 先改 §3.2,再改代码。 - 改对外签名 → 先改 §3.2,再改代码。
-`PRD.md` 冲突 → 以 `PRD.md` 为准,回改本文;与共享 `docs/coding-standards.md` 冲突 → 以 docs/ 为准并回改本文。 -`PRD.md` 冲突 → 以 `PRD.md` 为准,回改本文;与共享 `docs/coding-standards.md` 冲突 → 以 docs/ 为准并回改本文。
## 10. SaaS 多租户架构(指针)
> 完整设计(隔离策略、租户识别、缓存/异步隔离、前后端协作、扩展性、落地映射)见工作区 `../../../../docs/architecture.md §7`;编码强制约束见 `../../../../docs/coding-standards.md §9`。本文仅记录后端特有约束:
- 租户识别以 JWT `tenantId` 为唯一真相源;`X-Tenant-Id` 头仅透传/审计。
- `TenantContextHolder`ThreadLocal)由 `TenantInterceptor` 写入、`afterCompletion` 清除。
- 数据访问(JPA / `pi` 原生 SQL / `esb` 编排)一律带 `tenant_id`;缓存 key 前缀 `tenant:{tenantId}:``@Async``TenantTaskDecorator` 传播、Kafka/XXL-JOB 携带 `tenantId`
- 后端新增 `tenant/` 相关类(`config/TenantConfig``dao/Tenant*``api/TenantController``esb/TenantBizService`/`TenantProvisioningService``pi/TenantAccess`),包归属见 §2 / §6,纳入统一扫描。
@@ -92,3 +92,4 @@ Conventional Commits`type(scope): subject`。允许 type`feat` / `fix` / `
## 6. 不在本文范围(明确划清) ## 6. 不在本文范围(明确划清)
- 模块拆分归 `ARCHITECTURE.md`;行为/范围归 `PRD.md`;前后端共享约束(响应体/异常码/分页/APP_NAME/打包)归 `docs/coding-standards.md` - 模块拆分归 `ARCHITECTURE.md`;行为/范围归 `PRD.md`;前后端共享约束(响应体/异常码/分页/APP_NAME/打包)归 `docs/coding-standards.md`
- 多租户 SaaS 隔离与前后端协作归 `docs/architecture.md §7`;编码强制约束归 `docs/coding-standards.md §9`(后端落地见本仓库 `ARCHITECTURE.md §10`)。