SAG / ARCHITECTURE NOTE
多租户与 RLS:如何设计客户数据边界
介绍如何协同设计租户边界、服务器端权限和 RLS,确保多个组织共用一项服务时,数据和权限不会混杂。
多租户不是界面区分,而是数据契约
在订阅式服务中,多个客户组织会使用同一个应用程序和数据库。仅仅在界面上显示组织名称,并不能实现隔离。必须确认每次查询和更改属于哪个租户的请求,并确保无权访问的行在数据库层面也无法被访问。
SAG 将表示组织的租户与用户角色分别处理。用户登录后,服务器会检查会话和成员关系,并验证请求的资源是否属于该租户。服务器不会直接信任浏览器发送的组织标识符。
为什么要同时设置服务器端权限和 RLS
服务器端权限检查能够清晰、明确地表达业务规则。RLS(行级安全)则会在数据库中再次设置边界,即使查询出错,也能避免暴露其他组织的行。两层防护结合使用,可以降低一方的疏漏直接导致客户数据泄露的可能性。
核心原则如下:
- 对需要区分租户的表,设置明确的租户标识符。
- 对读取和写入应用相同的所有权验证。
- 区分平台管理员与客户运营人员的权限。
- 在审计日志中记录谁更改了哪些资源。
- 不要将 API 密钥、密码等机密值存储在普通运营记录中。
区分共享数据与客户专属数据
有些对象(例如竞争对手域名)可由多个客户共同观测;而客户问题、改进建议和审批记录等数据则应按组织进行保护。无条件复制前一类数据会增加运营成本,轻率共享后一类数据则会引发安全问题。SAG 会先定义数据的所有权和公开范围,再决定存储结构。
需要验证的故障场景
仅确认正常查询能够通过还不够。还需要确认:输入其他租户的 ID 时是否会返回 404 或权限错误;低权限用户是否无法调用更改 API;尝试用旧版本覆盖数据时是否能够检测到冲突。数据边界不是写在文档中的承诺,而是必须通过可重复测试证明的运营条件。
还要检查 RLS 所适用的执行角色
即使设置了 RLS 策略,表所有者或 BYPASSRLS 角色也可能绕过这些策略。SAG 的服务器端成员关系和租户条件检查会独立于此继续执行。必须同时检查数据库连接角色和策略的应用情况,才能判断隔离范围。
主题相关技术参考
如何继续了解这项技术
了解租户权限、任务重试、缓存和审批历史。
SAG / KNOWLEDGE LINKS
