mcpField
M
multitenant

multitenant

github.com/thebeardedbearsas开发107113 次安装今天更新
代码仓库

关于 multitenant

面向构建多租户应用的开发者,提供隔离策略、安全约束和实现参考。内容覆盖共享模式到独立数据库的隔离层级,以及 RLS、访问控制和迁移考量。

主要功能

  1. 01三种租户数据隔离层级
  2. 02tenant_id 传递与 PostgreSQL RLS
  3. 03租户隔离测试要求
  4. 04审计轨迹与字段级加密
  5. 05RBAC 与 ABAC 选择参考
  6. 06Laravel 和 Symfony 示例

适用场景

  1. 01为不同规模客户选择隔离方式
  2. 02防止查询意外跨租户读取数据
  3. 03规划租户专属架构迁移
  4. 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。

五项不可妥协的原则

  1. 每个请求都要传递 tenant_id(AsyncLocalStorage / SecurityContext / 中间件)。
  2. 所有表都必须启用 PostgreSQL 行级安全(RLS)。 作为应用层遗漏时的安全网。
  3. 必须进行隔离测试。 租户 A 绝不能读取或写入租户 B 的数据,包括通过排序、模糊查询、聚合操作访问。
  4. 审计记录必须按租户隔离。 未经明确许可,不得跨租户交叉引用日志。
  5. 对个人身份信息(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