| name | multitenant |
| description | Architecture multitenant avec approche tiered (Shared/Dedicated Schema/DB), RBAC/ABAC, field-level encryption. Use when working with multitenant applications, tenant isolation, data segregation. |
Multitenant â Quick Reference
Servir plusieurs clients (tenants) sur la mĂȘme base de code avec isolation stricte et un coĂ»t d'infra contrĂŽlĂ©.
Trois tiers d'isolation
| Tier | Isolation | Coût | Cas d'usage |
|---|
| Tier 1 â Shared schema | colonne tenant_id partout, filtres SQL automatiques | Faible | Startups, free / petits clients |
| Tier 2 â Dedicated schema | un schĂ©ma PostgreSQL par tenant | Moyen | SMB, clients exigeants |
| Tier 3 â Dedicated DB | une base entiĂšre par tenant | ĂlevĂ© | Enterprise, compliance stricte (HDS, FedRAMP) |
RÚgle de migration : commencer Tier 1, migrer un client en Tier 2/3 quand il représente > 20 % du revenu OU exige un SLA spécifique.
Cinq invariants non-négociables
tenant_id propagĂ© Ă chaque requĂȘte (AsyncLocalStorage / SecurityContext / middleware).
- PostgreSQL Row-Level Security (RLS) activé sur TOUTES les tables. Filet de sécurité contre un oubli applicatif.
- Tests d'isolation obligatoires. Tenant A ne doit jamais lire/Ă©crire les donnĂ©es de B â y compris via tri, requĂȘte nuĂ©e, agrĂ©gat.
- Audit trail isolé par tenant. Pas de log multi-tenant cross-référencé sans permission explicite.
- Field-level encryption sur PII / secrets sensibles (Halite PHP, Eloquent Casts, libsodium).
Pattern minimal â Shared schema + 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);
$conn->executeStatement(
'SET LOCAL app.tenant_id = :tid',
['tid' => $tenantId]
);
Anti-patterns critiques
- â Oublier le filtre
tenant_id dans une requĂȘte raw â fuite cross-tenant.
- â Cache Redis sans prĂ©fixe tenant â donnĂ©es de A retournĂ©es Ă B.
- â Job worker async qui perd le
tenant_id â impossible de retrouver le contexte.
- â Signed URLs / tokens sans
tenant_id dans le payload â utilisable cross-tenant.
- â Field encryption avec une clĂ© unique partagĂ©e â compromission = exposition totale (prĂ©fĂ©rer keys per tenant).
RBAC / ABAC
- RBAC : rĂŽles globaux (
admin, member, viewer) suffisent pour 80 % des cas.
- ABAC : passer à des policies (Casbin, Cerbos, OPA) quand les rÚgles dépendent d'attributs (région, montant, statut).
Pour aller plus loin
Patterns dĂ©taillĂ©s par tier, migration tier 1 â tier 2 sans downtime, tests d'isolation (Pest + tenant fixtures), RBAC/ABAC, exemples Laravel + Symfony, checklists par phase : voir @.claude/skills/multitenant/REFERENCE.md.