144 votes

Comment supprimer rapidement un utilisateur avec des privilèges existants ?

J'essaie de créer des utilisateurs de base de données restreints pour l'application sur laquelle je travaille, et je veux supprimer l'utilisateur de la base de données Postgres que j'utilise à titre expérimental. Existe-t-il un moyen de supprimer l'utilisateur sans devoir d'abord révoquer tous ses droits manuellement, ou révoquer toutes les subventions accordées à un utilisateur ?

166voto

Tim Kane Points 502

Et si

DROP USER <username>

Il s'agit en fait d'un alias pour DROP ROLE .

Vous devez explicitement supprimer tous les privilèges associés à cet utilisateur, ainsi que déplacer sa propriété vers d'autres rôles (ou supprimer l'objet).

Le meilleur moyen d'y parvenir est de

REASSIGN OWNED BY <olduser> TO <newuser>

et

DROP OWNED BY <olduser>

Cette dernière supprimera tous les privilèges accordés à l'utilisateur.

Voir la documentation de postgres pour DROP ROLE y la description plus détaillée de ceci.

Ajout :

Apparemment, essayer de supprimer un utilisateur en utilisant les commandes mentionnées ici ne fonctionnera que si vous les exécutez en étant connecté à la même base de données que celle à partir de laquelle les subventions originales ont été faites, comme indiqué ici :

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

13 votes

Faire : CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser a donné les messages d'erreur : ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo . Cependant, DROP OWNED BY testuser a fait l'affaire, apparemment Postgres considère les subventions comme des objets pouvant être déposés.

2 votes

Veuillez clarifier, @Tim Kane et millimoose : Je ne veux vraiment pas que les tables d'origine soient supprimées si je concède un SELECT sur FOO à TESTUSER, puis que je supprime OWNED BY TESTUSER. Je pense que vous êtes en train de dire que DROP OWNED BY ne supprime que les subventions mais ne supprime pas l'objet auquel la subvention a été accordée. Est-ce exact ?

3 votes

Andrew, le mieux est de lire la documentation pour obtenir des éclaircissements. DROP OWNED BY sera supprimer les tables appartenant à cet utilisateur. REASSIGN OWNED BY réassignera ces tables à un autre utilisateur. Choisissez-en un.

75voto

La réponse acceptée a donné lieu à des erreurs lorsque j'ai tenté de REASSIGNER OWNED BY ou de DROP OWNED BY. La solution suivante a fonctionné pour moi :

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

L'utilisateur peut avoir des privilèges dans d'autres schémas, auquel cas vous devrez exécuter la ligne REVOKE appropriée en remplaçant "public" par le schéma correct. Pour afficher tous les schémas et les types de privilèges d'un utilisateur, j'ai modifié le fichier \dp pour effectuer cette requête :

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

Je ne suis pas sûr des types de privilèges correspondant à la révocation sur les TABLES, les SEQUENCES ou les FONCTIONS, mais je pense que tous relèvent de l'un des trois.

19 votes

Je me devais d'ajouter celui-ci : REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;

4 votes

Également les privilèges de schéma.

4 votes

Pour les privilèges de schéma : revoke USAGE on SCHEMA some_schema from username;

17voto

Eric E Points 26

Notez également, si vous avez explicitement accordé :

CONNECT ON DATABASE xxx TO GROUP ,

vous devrez le révoquer séparément de DROP OWNED BY, en utilisant :

REVOKE CONNECT ON DATABASE xxx FROM GROUP

0 votes

J'avais essayé tout ce qui précède et ça ne marchait toujours pas pour moi, jusqu'à ce que je descende un peu plus bas pour trouver ceci, et maintenant il me reste quelques cheveux. Quelques-uns. :D merci !!

15voto

Preti Points 91

Voici ce qui a finalement fonctionné pour moi :

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

0 votes

Cela fonctionne très bien. Je faisais la même chose. Mais vos questions couvrent tout.

10voto

CD4 Points 121

J'ai dû ajouter une ligne de plus à REVOKE...

Après avoir couru :

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

Je recevais toujours l'erreur : le nom d'utilisateur ne peut pas être supprimé car certains objets en dépendent DÉTAIL : privilèges pour le schéma public

J'ai manqué ça :

REVOKE USAGE ON SCHEMA public FROM username;

Ensuite, j'ai pu abandonner le rôle.

DROP USER username;

0 votes

Vous pouvez également avoir besoin de révoquer les privilèges pour 'SCHEMA pg_catalog' si vous avez, par exemple, créé un utilisateur pour pg_rewind qui a des privilèges sur des fonctions comme pg_read_binary_file.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X