Tous les termes du glossaire

Sécurité au niveau des lignes (RLS)

Qu’est-ce que la sécurité au niveau des lignes (RLS) dans PostgreSQL ?

La sécurité au niveau des lignes permet à une table de déterminer, ligne par ligne, quelles lignes chaque rôle peut voir ou modifier, à l’aide de politiques créées avec CREATE POLICY.

La sécurité au niveau des lignes (RLS) restreint les lignes qu’une requête peut renvoyer ou modifier, séparément pour chaque rôle. Pour l’activer sur une table, utilisez ALTER TABLE ... ENABLE ROW LEVEL SECURITY, puis ajoutez des politiques avec CREATE POLICY. L’expression USING d’une politique filtre les lignes qu’un rôle peut voir, et une expression WITH CHECK détermine quelles lignes nouvelles ou modifiées sont autorisées.

Lorsque la RLS est activée et qu’aucune politique ne s’applique, PostgreSQL applique une politique de refus par défaut : aucune ligne n’est visible ni modifiable. Les superutilisateurs et les rôles dotés de l’attribut BYPASSRLS contournent toujours la sécurité au niveau des lignes, et les propriétaires de la table en général aussi, sauf si la table est configurée avec FORCE ROW LEVEL SECURITY. Testez vos politiques avec le rôle sous lequel votre application se connecte réellement.

Exemple

L’exemple active la RLS sur une table, ajoute une politique qui compare la colonne owner à current_user, puis interroge la table en tant que rôle alice. Seule la ligne d’alice est renvoyée. La préparation s’exécute en tant que superutilisateur, qui contourne la RLS ; la dernière requête change donc d’abord de rôle.

CREATE TABLE notes (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  owner text NOT NULL,
  body text NOT NULL
);
INSERT INTO notes (owner, body) VALUES ('alice', 'hello'), ('bob', 'hi');

ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY notes_owner ON notes USING (owner = current_user);

CREATE ROLE alice;
GRANT SELECT ON notes TO alice;

SET ROLE alice;
SELECT * FROM notes;
RESET ROLE;

Du SQL simple pour PostgreSQL 16 ou 17 standard, sans aucune extension. Exécutez-le dans une base de données vide que vous pouvez jeter ensuite.

Références

Documentation officielle de PostgreSQL (en anglais).

Termes associés