02 · ACCESS CONTROLP014 MIN
数据隔离与跨租户访问控制
从数据库查询、缓存、任务和对象存储的每个边界防止租户数据串线。
MENTAL MODELTENANT ISOLATION
01验证 Session
→02解析 Membership
→03建立 Tenant Context
→04查询 / 缓存 / Job 全程携带
先把概念与边界说清楚
定义告诉你它是什么,边界告诉你它不负责什么;企业系统最常见的误解通常发生在两者混用时。
Application Isolation
Repository 自动附加 tenant_id 条件,写入时从认证上下文注入归属。
Row Level Security
PostgreSQL 根据会话上下文在数据库层限制行,可形成第二道防线。
Cross-tenant Access
支持人员或上级组织访问必须通过显式策略、原因和审计,而不是临时关闭过滤。
缓存键导致订单串租户
服务用 order:${id} 缓存详情,不同租户恰好都有 id=42。
- 01
缓存键加入 tenant_id。
- 02
读取缓存后仍验证归属。
- 03
扫描队列载荷和对象存储路径的租户命名。
隔离从 SQL 扩展到所有数据通道,不再只检查数据库。
马上动手
- 列出请求、缓存、队列、文件四层的租户键。
- 为客服临时访问设计审批与过期。
常见坑
- 信任 X-Tenant-Id 而不查 Membership
- 缓存和导出任务漏租户
- 后台脚本用无范围超级账号
05 · KNOWLEDGE CHECKtenant_id 为什么必须来自认证上下文?查看答案⌄
答案
请求体和请求头由客户端控制;服务端应从当前用户已验证的组织成员关系解析可用租户,再接受用户在其范围内切换。