Aurabase Logo
aurabasedocs
docsGuidesSécurité & RBAC

Sécurité & RBAC

Row-Level Security natif Postgres, rôles prédéfinis, RBAC multi-tenant, audit logs. Vos règles vivent dans la base — testables, versionnées, impossibles à contourner côté client.

9 min de lecture·Niveau avancé·Révisé le 15 avr. 2026
#
Vue d’ensemble

La sécurité vit dans la base

§ 01

Aurabase utilise le Row-Level Security (RLS)natif de PostgreSQL. Cela signifie que vos règles d'accès sont écrites en SQL, stockées dans la base, appliquées à chaque requête — y compris celles faites par le SDK, PostgREST, ou psql direct.

Contourner une policy est impossible côté client. Le gateway valide chaque JWT avant d'ouvrir une connexion Postgres avec le rôle approprié. Les claims (auth.uid(), auth.role(), auth.tenant()) sont injectés via request.jwt.claims — non modifiables depuis une requête SQL.

Attention
Activez RLS sur chaque table. Par défaut, une table sans RLS est lisible par tous les rôles authentifiés. alter table ... enable row level security est la première chose à faire après create table.
#
Modèle mental

JWT → claims → policy → ligne

§ 02

Chaque requête suit le même chemin. Le gateway décode le JWT, vérifie sa signature (JWKS tournant RS256), extrait les claims, ouvre une connexion Postgres avec SET LOCAL role + SET LOCAL request.jwt.claims. Toutes les policies qui référencent auth.*() utilisent ces claims.

flux
TEXT
Client → Gateway verify JWT (JWKS RS256)
↓ extract { sub, role, tenant, exp }
Postgres SET LOCAL role = authenticated
SET LOCAL request.jwt.claims = {...}
SELECT ... FROM posts WHERE ...
↓ (RLS injecte la policy USING)
SELECT ... FROM posts WHERE author_id = auth.uid()
#
Rôles prédéfinis

Trois rôles Postgres, hiérarchie claire

§ 03
RôleClaimsDescription
anonAucun user_idRequêtes avec la clé anon, sans JWT user signé
authenticatedauth.uid() = userUtilisateur signé avec JWT valide (toute session Aurabase)
service_roleBypass RLSClé backend — passe toutes les policies. Serveur uniquement.
#
Policies RLS

Cinq patterns essentiels

§ 04

Les policies sont attachées à une table + une opération (SELECT/INSERT/UPDATE/DELETE) + un rôle. Plusieurs policies sur la même paire sont combinées en OR. Utilisez using pour filtrer les lignes existantes, with check pour valider les nouvelles valeurs.

migrations/posts_rls.sqlSQL
alter table posts enable row level security;
-- Lecture : auteur uniquement
create policy "posts_own_read"
on posts for select
to authenticated
using (auth.uid() = author_id);
Astuce
Testez vos policies avec pg_prove. Un fichier rls_posts.sql par table, exécuté en CI à chaque migration. Voir le guide RLS.
#
RBAC custom

Au-delà de anon / authenticated

§ 05

Les rôles applicatifs (admin, editor, viewer, billing…) sont définis dans project_{uuid}_auth.roles. Chaque utilisateur peut avoir N rôles. L'auth-server injecte roles dans le JWT, et auth.has_role('admin') devient utilisable dans vos policies.

policies/admin.sql
SQL
-- Admin voit tout
create policy "posts_admin_read"
on posts for select
to authenticated
using (auth.has_role('admin'));
-- Billing voit les colonnes sensibles en vue dédiée
create view posts_billing as
select id, author_id, revenue_cents from posts
where auth.has_role('billing');
#
Audit logs

Trace complète, export SIEM

§ 06

Chaque événement sécurité est logué dans project_{uuid}_auth.auth_audit_log : signin, signout, password_change, mfa_enroll, role_granted, service_role_access, failed_auth. Rétention 30 jours sur Pro, 2 ans sur Enterprise.

SESSIONS
1 847
FAILED AUTH
23
ROTATIONS
4
POLICY UPDATES
8
Info
Export automatique vers votre SIEM (Splunk, Datadog, Elastic) via webhook ou stream Kafka. Voir /docs/compliancepour les schémas d'événement détaillés.
Dernière mise à jour · 15 avr. 2026