Un rôle dans PostgreSQL peut représenter soit un utilisateur individuel, soit un groupe d'utilisateurs. Il gère l'accès aux bases de données, aux tables, aux schémas et à d'autres objets.
Quand tu crées un rôle, il n'est pas lié par défaut à un utilisateur ou à un groupe spécifique, mais tu peux lui attribuer des propriétés et des droits selon tes besoins.
Différence entre rôles et utilisateurs
Et les utilisateurs alors ? Faut pas confondre ! Dans PostgreSQL, les utilisateurs sont aussi considérés comme des rôles, mais avec une particularité : les utilisateurs ont toujours la possibilité de se connecter au système. Donc, chaque rôle peut être un utilisateur s'il a l'attribut LOGIN. Si tu veux juste regrouper des utilisateurs ou ne pas donner la possibilité de se connecter, tu n'ajoutes pas l'attribut LOGIN.
Exemple :
- Rôle avec l'attribut
LOGIN= utilisateur. - Rôle sans
LOGIN= groupe ou "rôle technique".
Créer un rôle
Pour créer des rôles, on utilise la commande CREATE ROLE. La syntaxe ressemble à ça :
CREATE ROLE <nom_du_rôle> [WITH] [paramètres];
Où paramètres — ce sont les propriétés du rôle, comme :
LOGIN— possibilité de se connecter à la base de données.CREATEDB— possibilité de créer des bases de données.CREATEROLE— possibilité de créer d'autres rôles.SUPERUSER— accès complet (les rôles les plus dangereux, à utiliser avec précaution).PASSWORD— mot de passe pour l'authentification.
Voyons un exemple de création d'un rôle utilisateur.
Supposons que tu veuilles créer un utilisateur student avec le droit de se connecter et un mot de passe. Pour ça, lance la requête suivante :
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
Cette commande va créer un rôle nommé student qui pourra se connecter à la base de données.
Maintenant, créons un rôle teachers qui sera un groupe. Un rôle de groupe n'a pas besoin de l'attribut LOGIN, car les utilisateurs du groupe utiliseront leurs propres comptes.
CREATE ROLE teachers;
Attribution des privilèges aux rôles
Les rôles dans PostgreSQL sont faits pour donner ou limiter l'accès aux ressources. Pour ça, on utilise les commandes GRANT et REVOKE.
Donner des droits avec GRANT
La syntaxe de la commande :
GRANT <privilèges> ON <objet> TO <rôle>;
Créons une table courses et donnons au rôle teachers les droits de lire et modifier les données dans cette table.
-- Créer la table
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- Donner l'accès
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
Maintenant, tous les utilisateurs du rôle teachers pourront voir, ajouter et modifier les données dans la table.
Retirer des droits avec REVOKE
Pour retirer des droits, on utilise la commande REVOKE. La syntaxe :
REVOKE <privilèges> ON <objet> FROM <rôle>;
Pour interdire au groupe teachers de modifier les données dans la table courses, exécute la commande :
REVOKE UPDATE ON courses FROM teachers;
Hiérarchie des rôles : héritage
Les utilisateurs peuvent "hériter" des privilèges d'un rôle-groupe pour simplifier la gestion. C'est comme transmettre un "héritage" d'un utilisateur à un autre.
Le mot-clé INHERIT permet à un rôle d'hériter des privilèges d'un autre rôle. Ce comportement est activé par défaut, mais tu peux le changer.
Exemple :
-- Ajouter l'utilisateur `john` au groupe `teachers`
GRANT teachers TO john;
Maintenant, l'utilisateur john aura automatiquement tous les privilèges attribués au rôle de groupe teachers.
Vérifions les privilèges :
\du john
Si tu veux désactiver l'héritage, crée le rôle avec l'attribut NOINHERIT.
CREATE ROLE admin NOINHERIT;
Maintenant, les utilisateurs du rôle admin ne pourront pas utiliser ses privilèges par défaut.
Créer des groupes de rôles pour gérer les accès
Les groupes de rôles simplifient la gestion des accès, surtout dans les gros projets. Au lieu de donner des droits à chaque utilisateur, tu ajoutes les utilisateurs dans des groupes, et tu donnes les droits aux groupes.
Voici un exemple simple de rôle de groupe. On va créer les groupes :
students— groupe pour les étudiants.teachers— groupe pour les enseignants.
CREATE ROLE students;
CREATE ROLE teachers;
Attribuons les utilisateurs aux groupes :
-- Ajouter l'utilisateur john au groupe students
GRANT students TO john;
-- Ajouter l'utilisateur jane au groupe teachers
GRANT teachers TO jane;
Maintenant, en donnant l'accès à la table aux groupes students et teachers, on le donne automatiquement à tous leurs membres !
Exercice pratique
- Crée une table
examsavec les champs :id: clé primaire ;subject: texte ;teacher_id: ID de l'enseignant.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- Crée les groupes de rôles
studentsetteachers.
CREATE ROLE students;
CREATE ROLE teachers;
- Donne au groupe
teachersles droits d'ajouter et de modifier des données dans la tableexams.
GRANT INSERT, UPDATE ON exams TO teachers;
- Donne au groupe
studentsuniquement le droit de lire les données.
GRANT SELECT ON exams TO students;
- Crée un utilisateur
aliceet ajoute-la au groupestudents.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- Vérifie quels droits a
aliceen te connectant avec son compte.
Maintenant tu sais comment créer des rôles, gérer leurs privilèges et simplifier l'administration avec des rôles de groupe. Dans la prochaine leçon, on verra comment configurer l'accès avec les commandes GRANT et REVOKE pour une gestion plus fine au niveau des bases de données, des schémas et des tables.
GO TO FULL VERSION