18.4. Appartenance d'un rôle
Il est souvent intéressant de grouper les utilisateurs pour faciliter
la gestion des droits : de cette façon, les droits peuvent être
donnés ou supprimés pour tout un groupe. Dans PostgreSQL™, ceci se fait en créant un
rôle représentant le groupe, puis en ajoutant les rôles utilisateurs
individuels membres de ce groupe.
Pour configurer un rôle en tant que groupe, créez tout d'abord le
rôle :
CREATE ROLE nom;
Typiquement, un rôle utilisé en tant que groupe n'aura pas l'attribut
LOGIN bien que vous puissiez le faire si
vous le souhaitez.
Une fois que ce rôle existe, vous pouvez lui ajouter et lui supprimer
des membres en utilisant les commandes GRANT et REVOKE :
GRANT role_groupe TO role1, ... ;
REVOKE role_groupe FROM role1, ... ;
Vous pouvez aussi faire en sorte que d'autres rôles groupes
appartiennent à ce groupe (car il n'y a pas réellement de distinction
entre les rôles groupe et les rôles non groupe). La base de données
ne vous laissera pas configurée des boucles circulaires
d'appartenance. De plus, il est interdit de faire en sorte qu'un
membre appartienne à PUBLIC.
Les membres d'un rôle peuvent utiliser les droits du rôle de deux
façons. Tout d'abord, chaque membre d'un groupe peut exécuter
explicitement SET ROLE pour « devenir » temporairement le rôle groupe. Dans cet
état, la session de la base de données a accès aux droits du rôle
groupe plutôt qu'à ceux du rôle de connexion original et tous les
objets créés sont considérés comme appartenant au rôle groupe, et non
pas au rôle utilisé lors de la connexion. Deuxièmement, les rôles
membres qui ont l'attribut INHERIT peuvent
utiliser automatiquement les droits des rôles dont ils sont membres.
Comme exemple, supposons que nous avons lancé les commandes suivantes
CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
Immédiatement après connexion en tant que joe, la session de la base de données peut utiliser
les droits donnés directement à joe ainsi
que ceux donnés à admin parce que joe « hérite »
des droits de admin. Néanmoins, les droits
donnés à wheel ne sont pas disponibles parce
que, même si joe est un membre indirect de
wheel, l'appartenance se fait via admin qui dispose de l'attribut NOINHERIT. Après
SET ROLE admin;
la session aura la possibilité d'utiliser les droits donnés à
admin mais n'aura plus accès à ceux de
joe. Après
SET ROLE wheel;
la session pourra utiliser uniquement ceux de wheel, mais ni ceux de joe ni
ceux de admin. L'état du droit initial peut
être restauré avec une des instructions suivantes
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
Note
La commande
SET
ROLE
autorisera toujours la sélection de tout
rôle dont le rôle de connexion est membre directement ou
indirectement. Du coup, dans l'exemple précédent, il n'est pas
nécessaire de devenir admin pour devenir
wheel.
Note
Dans le standard SQL, il existe une distinction claire entre les
utilisateurs et les rôles. Les utilisateurs ne peuvent pas
hériter automatiquement alors que les rôles le peuvent. Ce
comportement est obtenu dans PostgreSQL™ en donnant aux rôles
utilisés comme des rôles SQL l'attribut INHERIT, mais en donnant aux rôles utilisés en
tant qu'utilisateurs SQL l'attribut NOINHERIT. Néanmoins, par défaut, PostgreSQL™ donne à tous les rôles
l'attribut INHERIT pour des raisons de
compatibilité avec les versions précédant la 8.1 dans lesquelles
les utilisateurs avaient toujours les droits des groupes dont ils
étaient membres.
Les attributs LOGIN, SUPERUSER, CREATEDB et
CREATEROLE peuvent être vus comme des droits
spéciaux qui ne sont jamais hérités contrairement aux droits
ordinaires sur les objets de la base. Vous devez réellement utiliser
SET ROLE
vers un rôle
spécifique pour avoir un de ces attributs et l'utiliser. Pour
continuer avec l'exemple précédent, nous pourrions très bien choisir
de donner les droits CREATEDB et CREATEROLE au rôle admin.
Puis, une session connectée en tant que le rôle joe n'aurait pas ces droits immédiatement, seulement
après avoir exécuté
SET ROLE
admin
.
Pour détruire un rôle groupe, utilisez DROP ROLE:
DROP ROLE nom;
Toute appartenance à ce rôle est automatiquement supprimée (mais les
rôles membres ne sont pas autrement affectés). Notez néanmoins que
tous les objets dont le groupe était propriétaire doivent d'abord
être supprimés ou réaffectés ; et tous les droits accordés au rôle
groupe doivent être supprimés.