返回资讯列表

多租户隔离的三道边界:定义、权限与运行时

隔离不是一道墙,而是三道。任何一道缺失,另外两道都会在真实故障中失效。

多租户系统的隔离通常被简化为「数据加租户字段」。这在正常运行时看似有效,但在三类场景中会失效:结构定义被共享、权限判断依赖客户端、以及运行时缓存跨越租户。

第一道:定义边界

每个租户拥有独立的 Schema 命名空间与版本序列。共享的只有基础类型与系统字段,它们被冻结且不可被租户覆盖。这一道边界保证租户对结构的修改不会影响其他租户的解析结果。

第二道:权限边界

授权判断必须发生在服务端的数据访问层,而不是视图层或客户端。我们把 Grants 作为查询的强制谓词,任何读取路径都必须携带租户与主体上下文,缺失即拒绝。这条规则由编译期的类型约束与运行期的断言共同保证。

第三道:运行时边界

缓存、连接池、任务队列都必须以租户为键。我们在 2025 年遇到过一次真实的越界:任务队列的 worker 复用了上一个任务的租户上下文,导致一条通知发给了错误的租户。修复方式是把上下文设为任务参数的必填项,并在 worker 入口清空继承的上下文。

三道边界之间存在依赖关系:定义边界提供语义,权限边界提供访问控制,运行时边界提供执行隔离。任何一道缺失,另外两道都会在下一次故障中被穿透。