Utilisation avec DBManager sous QGIS
Méthode : Nous allons maintenant utiliser QGIS pour vérifier les droits avec les deux rôles.
Comme indiqué précédemment dans le paragraphe sur la gestion des connexions dans QGIS, créer la connexion suivante ci-contre.
On souhaite que cette connexion soit toujours réalisée avec l'utilisateur garyXX, on utilisera donc l'option Enregistrer le nom d'utilisateur.
Le recours à la table de métadonnées estimées (option) permet d'optimiser la rapidité d'ouverture des couches.
Constater qu'il n'y a aucune table avec géométrie accessible pour ce rôle (le rôle n'accède pas, pour l'instant, aux schémas consultation et production).
Faire Fermer
, puis créer cette connexion.
Lancer DBManager et vérifier les droits pour les deux connexions (le cas échéant faire clic droit reconnecter si nécessaire).
Pour l'instant le seul privilège de garyXX est de créer des tables temporaires.
On peut vérifier qu'il n'a aucun droit sur les schémas en se positionnant dessus.
Indiquons maintenant sous pgAdmin les droits sur le schéma consultation pour le rôle de groupe lecteurXX.
Se positionner sur le schéma consultation, faire un clic droit puis
Propriétés
Onglet sécurité (permet d'indiquer les droits sur le schéma) :
Cliquer sur la croix à droite de Droits pour ajouter une nouvelle ligne de droits.
Sélectionner le rôle lecteurXX dans le menu déroulant, puis dans la colonne Droits activer
USAGE
.
Ceci nous permet d'accorder le droit USAGE (on ne souhaite pas que les membres du groupe lecteur puisse eux-mêmes créer de nouveaux objets dans le schéma, on ne leur donne pas le privilège CREATE).
Notez que celui qui accorde les droits est le rôle en cours (ici stage00)
Valider.
On souhaite maintenant préciser les droits (privilèges) par défaut sur les futurs objets d'un schéma créés par un utilisateur.
voir la documentation de PostgreSQL sur ALTER DEFAULT PRIVILEGES
Nous souhaitons préciser les droits par défaut (dans notre cas le droit en lecture) pour le rôle de groupe lecteurXX sur les éventuels futures objets créés par garyXX (on admet pour les besoins de la démonstration que garyXX aura des droits de création dans le schéma consultation).
Dans la version 4 de pgAdmin, il n'est pas possible de choisir l'accordeur de droit qui est par défaut le propriétaire du schéma, hors nous voulons absolument que l'accordeur de droit soit garyXX pour que les droits par défaut s'appliquent aux futurs objets créés par lui.
IMPORTANT : Se connecter en tant que garyxx.
Relancer la boîte de dialogue des propriétés du schéma consultation. Nous allons utiliser l'onglet Privilèges par défaut.
Dans l'onglet Tables, ajouter une ligne en cliquant sur la croix à droite.
Choisir le bénéficiaire lecteurXX, (remplacer XX par votre numéro)
Dans la colonne 'droits' activer SELECT
En étant positionné sur le schéma consultation dans le navigateur, vérifier dans l'onglet propriété du schéma production que vous avez bien : droits par défaut de la table 'lecteur00=r/gary00'
(Remplacer le 00 par votre numéro de stagiaire)
Ceci indique que gary00 a octroyé les privilèges r (SELECT) au rôle lecteur00
Vérifier maintenant les droits dans DBManager en actualisant avec le bouton
Constater que, sur le schéma, l'utilisateur garyXX a maintenant le privilège Accéder aux objets
Se positionner sur la table commune dans le schéma consultation : constater que l'utilisateur n'a aucun privilège.
En effet nous avons indiqué les droits par défaut qui sont les droits qui seront appliqués par défaut aux futurs objets, mais qui ne s'appliquent pas aux objets existants.
Sous PgAdmin, se reconnecter en stageXX et faire un clic droit sur le schéma consultation, puis Assistant de gestion des droits.
Cliquer sur la case à cocher en haut à gauche pour tout cocher
Appuyer sur le bouton 'suivant' et ajouter les privilèges SELECT et USAGE pour le rôle lecteurXX.
Appuyer à nouveau sur 'suivant' et Vérifier l'ordre SQL :
GRANT SELECT, USAGE ON SEQUENCE consultation.commune_id_seq TO GROUP lecteurXX;
GRANT SELECT ON TABLE consultation.commune TO GROUP lecteurXX;
Terminer.
Vérifier les droits sous QGIS :
vérifier que la table commune est maintenant chargeable sous QGIS par un glisser-lâcher dans QGIS, ou par un clic droit 'ajouter au canevas'.
Vérifier que cette table n'est pas modifiable sous QGIS.
Complément : Droit par défaut sur les schéma (explication)
Il faut bien comprendre que les droits par défaut sur les schémas ne s'appliquent que pour les futurs objets crées par un utilisateur ou un rôle dont il est membre.
Sous pgAdmin on ne voit dans l'onglet propriétés -> sécurité qu'une seule ligne décrivant les droits par défaut pour les tables, mais on peut très bien avoir plusieurs rôles ayant attribués des droits par défaut.
En tant que SUPERUSER, pour définir des droits en fonction d'un rôle précis (exemple stageXX) on peur exécuter un SET ROLE :
Activer l'éditeur de requête en cliquant sur
Important : Pour indiquer que ce sont les droits par défaut pour les éventuels futurs objets de stageXX, il faut modifier l'ordre SQL dans l'éditeur, pour prendre provisoirement le rôle de stageXX avec une instruction SQL SET ROLE
juste avant le ALTER DEFAULT PRIVILEGES
(pour utiliser SET ROLE nomrole
, Il est obligatoire que l'utilisateur de la session courante soit membre du rôle nomrole
- si l'utilisateur de la session est superutilisateur- SUPERUSER, tous les rôles sont utilisables.)
Ajouter SET ROLE stageXX ;
avant ALTER DEFAULT...
et RESET ROLE
(pour réinitialiser le rôle à la valeur de la session) en dernière ligne.
La commande complète dans l'éditeur SQL doit donc être :
SET ROLE stageXX ;
ALTER DEFAULT PRIVILEGES IN SCHEMA consultation
GRANT SELECT ON TABLES
TO lecteurXX;
RESET ROLE ;
Exécuter la commande SQL en cliquant sur
Vous devez avoir un message 'Requête exécutée avec succès en 67 msec
Exemple : Pour avoir une vision exhaustive on peut utiliser la requête suivante :
SELECT
nspname, -- schema name
defaclobjtype, -- object type
defaclacl -- default access privileges
FROM pg_default_acl a JOIN pg_namespace b ON a.defaclnamespace=b.oid;
qui renvoi par exemple si stage00 est un deuxième rôle de connexion membre de ayant attribué des droits par défaut en lecture sur ses futures objets :
On a donc ici deux lignes décrivant les droits par défaut de gary00 et stage00 sur le schéma consultation.
Dans la pratique, il peut être intéressant de gérer cela au niveau des groupes et non des utilisateurs (surtout si le nombre d'utilisateurs est important). Ceci impliquera alors d'utiliser un SET ROLE à chaque création d'objet pour répercuter les droits au moment de la création de l'objet.
SET ROLE -NomRoleDeGroupe;
... REQUETE ...
RESET ROLE ;