Vous n'êtes pas identifié(e).
Bonsoir,
Je viens à peine de commencer à me mettre à PostGreSQL, mais je me suis heurté à un problème auquel la documentation n'a pu m'aider :(
Je m'explique :
Je crée un utilisateur "usrtest1" qui sera propriétaire de la base de donnée "dbtest1". Jusque là pas de problèmes.
Je me connecte avec l'utilisateur postgres (su postgres), je fais "psql -l" et la commande me renvois :
List of databases
Name | Owner | Encoding
-----------+----------+----------
dbtest1 | usrtest1 | UTF8
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(4 rows)
Ce qui est logique vu que je suis avec l'utilisateur postgres qui est superutilisateur.
maintenant je me connecte avec l'utilisateur usrtest1 (psql -U usrtest1 -d dbtest1 -c '\l')
Voilà ce que me renvois la commande :
List of databases
Name | Owner | Encoding
-----------+----------+----------
dbtest1 | usrtest1 | UTF8
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(4 rows)
Et voila le problème, je ne veut pas que l'utilisateur usrtest1 voit les bases des autres utilisateurs, en plus il peut effectuer des query sur les bases qui ne sont pas les siennes.
J'ai testé de faire des rôles et de supprimer touts les accès de ceux ci sur les autres bases, rien ne change il peut toujours visualiser les autres bases.
Donc il me faudrait un moyen que lorsque l'utilisateur liste les bases, seulement celles dont il est le propriétaire s'affichent, et pas les autres ce qui devrais me donner quand je fais cette commande : psql -U usrtest1 -d dbtest1 -c '\l'
List of databases
Name | Owner | Encoding
-----------+----------+----------
dbtest1 | usrtest1 | UTF8
(1 rows)
Avez vous une solution ?
Je tiens à préciser que je n'utilise pas phpPgAdmin (pas de php, uniquement apache CGI (c++)), uniquement les outils du style de Navicat et PgAdmin et la ligne de commande.
J'ai testé le coup du 'revoke select on pg_database from public;' cette solution me parait extrêmement barbare!?!
Je vous remercie d'avance.
Amicalement,
Xeon.
Hors ligne
Tous les utilisateurs ont le droit d'obtenir la liste de toutes les bases du clusters. On ne peut 'que' leur interdire l'accès à ces bases :
- Soit via le pg_hba.conf
- Soit en révoquant le droit de connexion à la base pour tous les utilisateurs. De mémoire REVOKE CONNECT ON DATABASE xxx FROM public;
Si tu fais la deuxième solution, tu peux l'appliquer à la base template1, ce qui fait que toutes les autres bases créées ensuite auront la même politique par défaut.
Mais psql -l te donnera la liste de toutes les bases.
Ensuite, rien ne t'empêche par exemple de faire une requête sur la base, et d'en faire un alias sur le système
SELECT pg_database.datname from pg_database join pg_user on (pg_database.datdba=pg_user.usesysid) where usename=current_user;
Dernière modification par Marc Cousin (03/11/2009 08:54:34)
Marc.
Hors ligne
Bonjour,
Je vous remercie pour votre réponse.
Je vais essayer et je vous tiens au courant.
Amicalement,
Xeon.
Hors ligne
Bonsoir,
Cette méthode me plait, je vais l'utiliser.
je vous remercie pour votre réponse.
Amicalement,
Xeon.
Dernière modification par xeon (04/11/2009 19:22:41)
Hors ligne