From: | Guillaume Lelarge <guillaume(at)lelarge(dot)info> |
---|---|
To: | Marc Jacquin <marc(dot)jacquin(at)magellium(dot)fr> |
Cc: | "'pgsql-fr-generale(at)postgresql(dot)org'" <pgsql-fr-generale(at)postgresql(dot)org> |
Subject: | Re: Utilisation de drop owned ou reassign owned |
Date: | 2010-03-27 01:48:02 |
Message-ID: | 4BAD63D2.4000808@lelarge.info |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Le 26/03/2010 21:51, Marc Jacquin a écrit :
> Merci Guillaume pour ces infos.
>
> En réalité on peut considérer que l'utilisateur qui fait le drop owned est
> le 'manager' d'un groupe et qu'il supprime ou créé un utilisateur de ce
> groupe mais avant de le faire supprime ou réassigne les données de
> l'utilisateur.
>
> L'utilisateur qui exécute est donc par essence membre du groupe dont
> l'utilisateur à supprimer est aussi. Pour tout dire, le manager créé
> l'utilisateur et lui donne le rôle du même groupe que lui-même et cherche à
> le supprimer après. Une délégation d'administration sur un groupe en
> quelques sortes.
>
> Donc il y a un rôle de groupe toto un role de connexion toto_mgr qui a le
> droit CREATEROLE et INHERIT et un utilisateur lambda toto2.
>
> Mon 'manager' a le droit INHERIT mais le problème reste entier, toto_mgr ne
> peut pas faire un drop owned sur toto2.
>
> Est-ce que le role de groupe toto doit hériter d'un groupe qui a les droits
> superuser ?
>
Une explication plus détaillée :
guillaume(at)laptop:~$ psql postgres
psql (8.4.3)
Saisissez « help » pour l'aide.
postgres=# CREATE USER u1 CREATEROLE;
CREATE ROLE
postgres=# CREATE USER u2 CREATEUSER;
CREATE ROLE
postgres=# CREATE USER u3;
CREATE ROLE
postgres=# CREATE DATABASE b1;
CREATE DATABASE
postgres=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> CREATE TABLE t1 ();
CREATE TABLE
J'ai donc trois utilisateurs, leur différence étant dans le droit de
création d'utilisateurs (CREATEROLE, CREATEUSER et NOCREATEROLE). u3 est
propriétaire de la table t1.
b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=> DROP OWNED BY u3;
ERREUR: droit refusé pour supprimer les objets
INSTRUCTION : DROP OWNED BY u3;
Tout à fait logiquement, u1, bien qu'ayant le droit de créer des
utilisateurs, ne peut pas les supprimer s'ils sont propriétaires
d'objets, et ne peut pas supprimer les objets qu'ils ont créé.
b1=> \c b1 u2
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u2 ».
b1=# DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=# DROP OWNED BY u3;
DROP OWNED
u2 a la droit de supprimer les objets de u1 car il a le droit CREATEUSER
(qui est l'équivalent de SUPERUSER). Donc bien différencier CREATEUSER
et CREATEROLE, ce n'est pas la même chose.
b1=# GRANT u3 TO u1;
GRANT ROLE
b1=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> CREATE TABLE t1 ();
CREATE TABLE
b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
ERREUR: le rôle « u3 » ne peut pas être supprimé car d'autres objets en
dépendent
DÉTAIL: propriétaire de table t1
INSTRUCTION : DROP USER u3;
b1=> DROP OWNED BY u3;
DROP OWNED
Avec le GRANT de u1 sur u3, u1 dispose des droits sur les objets de u3
et peut donc logiquement supprimer les objets de u3.
b1=> \c b1 guillaume
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « guillaume ».
b1=# CREATE ROLE proprio;
CREATE ROLE
b1=# GRANT proprio TO u3;
GRANT ROLE
b1=# \c b1 u3
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u3 ».
b1=> ALTER TABLE t1 OWNER TO proprio;
ALTER TABLE
b1=> \c b1 u1
psql (8.4.3)
Vous êtes maintenant connecté à la base de données « b1 » comme
utilisateur « u1 ».
b1=> DROP USER u3;
DROP ROLE
Évidemment, le plus simple est de mettre comme propriétaire un groupe.
Comme ça, même pas besoin du DROP OWNED BY.
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
From | Date | Subject | |
---|---|---|---|
Next Message | dazz | 2010-03-29 17:51:45 | Re: Devenir membre de l'association PostgreSQL Europe : c'est facile ! |
Previous Message | Guillaume Lelarge | 2010-03-26 18:20:03 | Re: Utilisation de drop owned ou reassign owned |