Row-Level Security en production
Trois patterns RLS couvrant 95% des cas d'usage : ownership, multi-tenant, org hiérarchique. Avec tests pg_prove et debug.
Qu’est-ce que RLS
Row-Level Security est une feature native PostgreSQL qui filtre les lignes retournées (ou acceptées) à la volée, en évaluant une expression SQL qui peut dépendre du rôle courant et de claims JWT. Aurabase injecte les claims user via request.jwt.claims et expose les helpers auth.uid(), auth.role(), auth.tenant(), auth.has_role().
Ownership — chaque user ses propres lignes
Cas d'usage : profils, notes, posts où chaque ligne appartient à un utilisateur unique via user_id ou author_id.
for all avec using + with check pour couvrir SELECT/UPDATE/DELETE en une policy. L'INSERT utilise seulement with check.Multi-tenant — scope par organisation
Cas d'usage : B2B SaaS où chaque user appartient à une organisation, et voit toutes les données de son org. Le JWT contient tenant, le helper auth.tenant() le retourne.
Org hiérarchique — permissions par rôle
Cas d'usage : SaaS où les rôles dans une org (admin, member, viewer) ont des permissions différentes. On combine auth.tenant() avec auth.has_role().
pg_prove — une assertion par policy
Les policies sont du code. On les teste. pgTAP + pg_prove tournent en CI sur chaque migration.
Quand la policy ne fait pas ce que vous voulez
- RLS désactivée ? Vérifiez avec
select relrowsecurity from pg_class where relname = 'posts' - Policies qui s'additionnent : multiple policies sur même table + opération + rôle combinent en OR. Restreignez avec AND dans une seule policy si besoin
- Permissions GRANT manquantes : même avec une policy, le rôle doit avoir
grant select on posts to authenticated - Claims non injectés : depuis Postgres,
select current_setting('request.jwt.claims', true)— null signifie que vous êtes en direct DB, pas via le gateway