关于 multitenant
面向构建多租户应用的开发者,提供隔离策略、安全约束和实现参考。内容覆盖共享模式到独立数据库的隔离层级,以及 RLS、访问控制和迁移考量。
主要功能
- 01三种租户数据隔离层级
- 02tenant_id 传递与 PostgreSQL RLS
- 03租户隔离测试要求
- 04审计轨迹与字段级加密
- 05RBAC 与 ABAC 选择参考
- 06Laravel 和 Symfony 示例
适用场景
- 01为不同规模客户选择隔离方式
- 02防止查询意外跨租户读取数据
- 03规划租户专属架构迁移
- 04制定访问控制和敏感字段保护方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ thebeardedbearsas/ claude-craft --skill multitenant安装后在 Claude Code 中输入/multitenant确认已加载。
附带文件REFERENCE.md
详细介绍
多租户 — 快速参考
在同一套代码中为多个客户(租户)提供服务,实现严格隔离并控制基础设施成本。
三种隔离级别
| 级别 | 隔离方式 | 成本 | 使用场景 |
|---|---|---|---|
| 级别 1 — 共享架构 | 所有表都包含 tenant_id 列,自动应用 SQL 筛选条件 | 低 | 初创公司、免费用户 / 小客户 |
| 级别 2 — 独立架构 | 每个租户使用一个 PostgreSQL 架构 | 中 | SMB、要求较高的客户 |
| 级别 3 — 独立数据库 | 每个租户使用一个完整数据库 | 高 | 企业客户、严格合规要求(HDS、FedRAMP) |
迁移规则:从级别 1 开始;当某个客户的收入占比超过 20%,或要求专属 SLA 时,将其迁移到级别 2 或 3。
五项不可妥协的原则
- 每个请求都要传递
tenant_id(AsyncLocalStorage / SecurityContext / 中间件)。 - 所有表都必须启用 PostgreSQL 行级安全(RLS)。 作为应用层遗漏时的安全网。
- 必须进行隔离测试。 租户 A 绝不能读取或写入租户 B 的数据,包括通过排序、模糊查询、聚合操作访问。
- 审计记录必须按租户隔离。 未经明确许可,不得跨租户交叉引用日志。
- 对个人身份信息(PII)/敏感机密进行字段级加密(Halite PHP、Eloquent Casts、libsodium)。
最简模式 — 共享架构 + RLS
ALTER TABLE invoices ADD COLUMN tenant_id UUID NOT NULL;
ALTER TABLE invoices ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON invoices
USING (tenant_id = current_setting('app.tenant_id')::uuid);
// Symfony — middleware qui set la variable session pour RLS
$conn->executeStatement(
'SET LOCAL app.tenant_id = :tid',
['tid' => $tenantId]
);
关键反模式
- ❌ 在原始查询中忘记添加
tenant_id筛选条件 → 造成跨租户数据泄露。 - ❌ Redis 缓存没有租户前缀 → 将租户 A 的数据返回给租户 B。
- ❌ 异步作业 Worker 丢失
tenant_id→ 无法恢复上下文。 - ❌ 签名 URL / 令牌的载荷中没有
tenant_id→ 可跨租户使用。 - ❌ 字段加密使用同一个共享密钥 → 密钥泄露即导致全部数据暴露(应优先为每个租户单独使用密钥)。
RBAC / ABAC
- RBAC:全局角色(
admin、member、viewer)足以满足 80% 的场景。 - ABAC:当规则取决于属性(地区、金额、状态)时,改用策略(Casbin、Cerbos、OPA)。
深入了解
各隔离级别的详细模式、从级别 1 迁移到级别 2 且不中断服务、隔离测试(Pest + 租户 fixtures)、RBAC/ABAC、Laravel + Symfony 示例、各阶段检查清单:请参阅
@.claude/skills/multitenant/REFERENCE.md。
评论
支持 Markdown