SuperAPI AI 工具集

multitenant

智能体与模型

查看项目

更新于 10-16 00:21

技能介绍

多租户(Multitenant)是一份面向多租户应用架构的快速参考,目标是在同一份代码库上服务多个租户,同时保证严格隔离与可控的基础设施成本。

用途:设计、实现或审查多租户系统,重点解决数据隔离、租户上下文传播、权限控制与敏感数据加密问题。

三种隔离层级:Tier 1 共享架构,所有表带 tenant_id 列并自动过滤,成本低,适合初创与免费/小型客户;Tier 2 独立架构,每个租户一个 PostgreSQL schema,成本中等,适合中小企业与要求较高的客户;Tier 3 独立数据库,每个租户一个完整数据库,成本高,适合企业级与严格合规场景(HDS、FedRAMP)。迁移建议:从 Tier 1 起步,当某租户收入占比超过 20% 或要求特定 SLA 时迁至 Tier 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 中通过中间件设置会话变量:$conn->executeStatement('SET LOCAL app.tenant_id = :tid', ['tid' => $tenantId]);

关键反模式:原始查询遗漏 tenant_id 过滤导致跨租户泄漏;Redis 缓存未加租户前缀;异步任务丢失 tenant_id 上下文;签名 URL 或令牌 payload 不含 tenant_id;字段加密使用共享密钥(应优先按租户分配密钥)。

RBAC / ABAC:RBAC 用全局角色(admin、member、viewer)即可覆盖约 80% 场景;当规则依赖属性(区域、金额、状态)时改用策略方案(Casbin、Cerbos、OPA)。

限制与未提供内容:本资料主要给出架构原则、示例片段与检查清单,详细的按层级模式、Tier 1 到 Tier 2 无停机迁移、隔离测试(Pest 加租户 fixtures)、Laravel 与 Symfony 示例及分阶段清单需查阅 @.claude/skills/multitenant/REFERENCE.md;未提供具体定价、性能基准或部署步骤。