SaaS engineering · 2026-09-04
多租户GEO系统怎样证明资产没有串线?
答案不是“每张表都有租户字段”,而是一次内容从证据、版本、发布到观测都只能在同一租户边界内流转,并且负向请求会被拒绝。本文适合设计GEO内容与观测系统的团队,不代表任何项目已经获得商用放行。
隔离从归属链开始,不从页面筛选开始
工程事实是:页面上的租户筛选只能改变展示,不能替代服务端约束。每个事实、证据、内容版本、平台账号、发布任务、公开回执和模型批次都应带稳定归属键;下游对象创建时,还要验证上游对象属于同一租户。仅凭一个可猜的资产ID读取,再由前端隐藏结果,仍然可能泄露数据。
建议把归属校验放进仓储层或领域服务的统一入口,并让后台列表、导出、定时任务和重试器复用同一规则。未知项是不同数据库与对象存储组合下的最佳实现;不能只凭架构图断言隔离已经成立。
四类资产要使用不同的唯一约束
同一个slug可以出现在不同租户,但公开域名与slug组合必须唯一;同一个平台名称也可复用,但账号授权不能复用。幂等键若只包含平台和文章ID,没有租户与账号维度,重试时就可能把A租户的完成回执写到B租户任务。
正向通过不够,必须构造串线请求
可执行验收至少包括:A租户创建证据与文章,B租户用已知ID读取、编辑、导出、排期和删除;后台管理员切换租户后复用旧分页游标;定时任务同时领取两个租户同平台任务;回执携带错误租户或错误账号。预期不是返回空白后继续,而是明确拒绝、记录审计事件且不改变任何对象。
边界样本还应覆盖共享模板。模板可以是全局只读资源,但由模板生成的正文、图片和审核结论必须重新归属;不能因为两篇稿件源自同一模板就共享证据结论。
删除演练是隔离合同的最后一段
- 导出某租户全部资产,并核对没有其他租户的对象。
- 撤销该租户平台授权,确认其他租户任务继续运行。
- 删除或匿名化时列出数据库、对象存储、搜索索引和缓存的处理状态。
- 依法和按合同明确审计记录、备份与正文的保留范围、期限、访问限制及到期清理;不能笼统承诺立即删除所有可恢复副本。
- 恢复演练只恢复目标租户,不用整库覆盖其他客户;恢复后重新应用已登记的删除或访问限制。
事实边界是:候选系统通过单元测试,只能证明测试场景内未发现串线;生产隔离还需要数据库约束、对象存储策略、审计日志和删除演练共同证明。尚未覆盖的第三方平台副本,应明确列为外部删除依赖,而不是标成已清除。本节是工程验收清单,具体保留义务须另行核定。
现场检查清单要能定位到具体对象
实际检查可以先为两个测试租户各创建同名路径、同平台任务与同名图片,再逐项交换资产、版本、账号和批次标识。每个请求都保存HTTP状态、审计事件和变更前后摘要;只看到页面没有数据还不够,还要确认数据库、对象存储和任务队列都没有副作用。
例如导出接口正确拒绝跨租户请求,但异步导出任务仍被创建,就不能判定通过。停止条件是任一裸标识路径可以读取、计数、缓存或修改其他租户对象。修复后应重跑读取、写入、批处理、恢复和删除五条路径,而不是只重测最初暴露的页面。
可直接执行的负向请求矩阵
以下是测试设计,不是已经通过的生产报告。先在隔离测试环境准备A、B两个租户,创建同名但不同归属的资产,冻结变更前摘要。请求身份保持B,只交换目标ID,避免把管理员权限误当普通租户权限。
拒绝可以采用统一的403或404策略,关键是不泄露、不越权、无副作用;不是要求所有接口返回同一文案。测试结果需要连同时间、环境和未覆盖路径保存。合同里的导出与退出权,可对照采购GEO SaaS前怎样检查数据与退出权。