SaaS engineering · 2026-09-04

多租户GEO系统怎样证明资产没有串线?

隔离从归属链开始,不从页面筛选开始

工程事实是:页面上的租户筛选只能改变展示,不能替代服务端约束。每个事实、证据、内容版本、平台账号、发布任务、公开回执和模型批次都应带稳定归属键;下游对象创建时,还要验证上游对象属于同一租户。仅凭一个可猜的资产ID读取,再由前端隐藏结果,仍然可能泄露数据。

建议把归属校验放进仓储层或领域服务的统一入口,并让后台列表、导出、定时任务和重试器复用同一规则。未知项是不同数据库与对象存储组合下的最佳实现;不能只凭架构图断言隔离已经成立。

四个租户隔离舱分别约束事实证据、内容版本、发布账号和观测报告,中间只有经归属校验的同租户流转
图可左右滑动查看。隔离验收关注完整归属链;任何一段只按裸ID读取,都会留下跨租户串线入口。

四类资产要使用不同的唯一约束

资产层建议归属键失败时的风险
事实与证据租户 + 项目 + 证据跨租户证据不可被搜索或绑定
内容与版本租户 + 资产 + 版本修订不覆盖其他项目与历史稿
发布与账号租户 + 平台 + 账号授权、租约和回执不能串线
观测与报告租户 + 协议 + 批次问题、回答和分母保持同一归属

同一个slug可以出现在不同租户,但公开域名与slug组合必须唯一;同一个平台名称也可复用,但账号授权不能复用。幂等键若只包含平台和文章ID,没有租户与账号维度,重试时就可能把A租户的完成回执写到B租户任务。

正向通过不够,必须构造串线请求

可执行验收至少包括:A租户创建证据与文章,B租户用已知ID读取、编辑、导出、排期和删除;后台管理员切换租户后复用旧分页游标;定时任务同时领取两个租户同平台任务;回执携带错误租户或错误账号。预期不是返回空白后继续,而是明确拒绝、记录审计事件且不改变任何对象。

边界样本还应覆盖共享模板。模板可以是全局只读资源,但由模板生成的正文、图片和审核结论必须重新归属;不能因为两篇稿件源自同一模板就共享证据结论。

删除演练是隔离合同的最后一段

  • 导出某租户全部资产,并核对没有其他租户的对象。
  • 撤销该租户平台授权,确认其他租户任务继续运行。
  • 删除或匿名化时列出数据库、对象存储、搜索索引和缓存的处理状态。
  • 依法和按合同明确审计记录、备份与正文的保留范围、期限、访问限制及到期清理;不能笼统承诺立即删除所有可恢复副本。
  • 恢复演练只恢复目标租户,不用整库覆盖其他客户;恢复后重新应用已登记的删除或访问限制。

事实边界是:候选系统通过单元测试,只能证明测试场景内未发现串线;生产隔离还需要数据库约束、对象存储策略、审计日志和删除演练共同证明。尚未覆盖的第三方平台副本,应明确列为外部删除依赖,而不是标成已清除。本节是工程验收清单,具体保留义务须另行核定。

现场检查清单要能定位到具体对象

实际检查可以先为两个测试租户各创建同名路径、同平台任务与同名图片,再逐项交换资产、版本、账号和批次标识。每个请求都保存HTTP状态、审计事件和变更前后摘要;只看到页面没有数据还不够,还要确认数据库、对象存储和任务队列都没有副作用。

例如导出接口正确拒绝跨租户请求,但异步导出任务仍被创建,就不能判定通过。停止条件是任一裸标识路径可以读取、计数、缓存或修改其他租户对象。修复后应重跑读取、写入、批处理、恢复和删除五条路径,而不是只重测最初暴露的页面。

可直接执行的负向请求矩阵

以下是测试设计,不是已经通过的生产报告。先在隔离测试环境准备A、B两个租户,创建同名但不同归属的资产,冻结变更前摘要。请求身份保持B,只交换目标ID,避免把管理员权限误当普通租户权限。

请求预期结果必须回读
B读取或编辑A的版本ID按既定策略拒绝,不暴露正文或对象存在性A正文及版本摘要不变
B导出A资产,或提交混合ID批次拒绝且不生成异步导出任务队列、文件存储、计数均无跨租户副作用
B任务绑定A账号或回执绑定失败,不领取A授权租约、授权使用记录与回执归属不变
B删除A对象,或复用A分页游标删除被拒;游标按作用域失效对象、缓存和列表没有泄露或更改

拒绝可以采用统一的403或404策略,关键是不泄露、不越权、无副作用;不是要求所有接口返回同一文案。测试结果需要连同时间、环境和未覆盖路径保存。合同里的导出与退出权,可对照采购GEO SaaS前怎样检查数据与退出权。