关键要点
- 租户上下文必须在每个执行边界显式且经过验证。
- 授权属于领域操作,而不仅仅是路由中间件。
- 队列、缓存、导出、日志和支持工具都是隔离模型的一部分。
- 持续测试跨租户拒绝路径。
01
多租户是一种授权架构
一个 tenant_id 列是有用的,但它不是隔离策略。请求流经浏览器、API、服务、队列、缓存、对象存储、导出和支持工作流。每个边界都需要明确的租户身份以及关于什么可以跨越它的规则。
最安全的默认做法是从经过认证的成员关系和服务端路由中派生租户上下文——而非接受来自客户端的任意标识符。
02
根据后果选择隔离方式
共享表、独立模式和独立数据库提供不同的运维和隔离特性。正确的选择取决于规模、自定义需求、法规要求、噪声邻居风险、备份和恢复需求,以及运维能力。
混合模型很常见:大多数租户共享一个索引良好的模式,而选定的工作负载获得更强的物理隔离。应用程序应将该放置策略隐藏在稳定的仓储层或服务之后。
04
后台工作是常见的隔离失败点
每个任务都应携带不可变的租户和操作者上下文,在执行期间再次验证,并将输出写入租户范围内的位置。通用的缓存键、复用的临时目录和未限定范围的导出文件名可以绕过原本严格的 API 授权。
- 以租户为前缀的缓存和对象存储键
- 在需要时按租户进行速率和并发控制
- 限定范围的日志和追踪,避免敏感负载泄露
- 需要审批、理由、过期时间和审计历史的支持模拟身份操作
05
测试负空间
正向测试证明用户可以访问自己的数据。隔离测试证明标识符、过滤器、导出、Webhook、搜索和时序不能暴露其他租户的数据。
在集成测试中创建两个租户,系统性地尝试跨边界的读取和变更。包括工作进程、批量操作、管理工具和故障路径——而不仅仅是 HTTP 端点。