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 :
GRANTrole_groupe
TOrole1
, ... ; REVOKErole_groupe
FROMrole1
, ... ;
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 configurer
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 groupe 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, ceci incluant les droits hérités par ces rôles.
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;
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
.
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).