PostgreSQL - wie Sie einen Benutzer mit vorhandenen Berechtigungen schnell löschen können


122

Ich versuche, eingeschränkte DB-Benutzer für die App zu erstellen, an der ich arbeite, und ich möchte den Postgres-Datenbankbenutzer löschen, den ich zum Experimentieren verwende. Gibt es eine Möglichkeit, den Benutzer zu löschen, ohne zuerst alle seine Rechte manuell widerrufen zu müssen, oder alle Berechtigungen eines Benutzers zu widerrufen?

Antworten:


144

Wie wäre es mit

DROP USER <username>

Dies ist eigentlich ein Alias ​​für DROP ROLE.

Sie müssen alle mit diesem Benutzer verknüpften Berechtigungen explizit löschen, um seinen Besitz auf andere Rollen zu übertragen (oder das Objekt zu löschen).

Dies wird am besten erreicht durch

REASSIGN OWNED BY <olduser> TO <newuser>

und

DROP OWNED BY <olduser>

Letzteres entfernt alle dem Benutzer gewährten Berechtigungen.

Weitere Informationen hierzu finden Sie in den Postgres-Dokumenten für DROP ROLE und in der detaillierteren Beschreibung .


Zusatz:

Anscheinend funktioniert der Versuch, einen Benutzer mit den hier genannten Befehlen zu löschen, nur, wenn Sie ihn ausführen, während Sie mit derselben Datenbank verbunden sind, aus der die ursprünglichen GRANTS erstellt wurden, wie hier beschrieben:

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


11
Tun: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser gab die Fehlermeldungen : ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. DROP OWNED BY testuserHat der Trick jedoch getan, betrachtet Postgres Zuschüsse anscheinend als abwerfbare Objekte.
Millimoose

1
Bitte klären Sie, @Tim Kane und Millimoose: Ich möchte wirklich nicht, dass die Originaltabellen gelöscht werden, wenn ich die Auswahl von FOO TO TESTUSER und dann DROP OWNED BY TESTUSER erteile. Ich denke, Sie sagen, dass DROP OWNED BY nur die Zuschüsse löscht, aber nicht das Objekt, für das der Zuschuss gewährt wurde. Richtig?
Andrew Wolfe

1
Andrew, lesen Sie am besten die Dokumentation zur Klarstellung. DROP OWNED BY werden Tabellen , die von diesem Benutzer gehören fallen. REASSIGN OWNED BY weist diese Tabellen einem anderen Benutzer zu. Wähle ein.
Tim Kane

3
Wenn Sie sich Sorgen machen, dass DROP OWNED BY zu viel herausnimmt, nachdem Sie REASSIGN OWNED ausgeführt haben, während noch Berechtigungen bestehen, können Sie ALLES AUF ALLEN [TABELLEN | SEQUENZEN | ...] IN SCHEMA [Schemaname] FROM [Rolle]
jla

In der Tat ist der Befehl DROP OWNED BY in seiner Bedeutung und Wirkung etwas mehrdeutig. Ich musste das Dokument sorgfältig lesen, um es richtig zu machen. Danke für die Beiträge Jungs.
Sébastien Clément

49

Die akzeptierte Antwort führte bei dem Versuch, REASSIGN OWNED BY oder DROP OWNED BY zu verwenden, zu Fehlern. Folgendes hat bei mir funktioniert:

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;

Der Benutzer verfügt möglicherweise über Berechtigungen in anderen Schemas. In diesem Fall müssen Sie die entsprechende REVOKE-Zeile ausführen, wobei "public" durch das richtige Schema ersetzt wird. Um alle Schemas und Berechtigungstypen für einen Benutzer anzuzeigen, habe ich den Befehl \ dp bearbeitet, um diese Abfrage durchzuführen:

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%';

Ich bin nicht sicher, welche Berechtigungstypen dem Widerruf von TABELLEN, SEQUENZEN oder FUNKTIONEN entsprechen, aber ich denke, dass alle unter eine der drei fallen.


12
Ich musste auch diesen hinzufügen:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
Auch Schema-Berechtigungen.
Greatvovan

2
Für Schema-Berechtigungen:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

Ich habe es versucht, aber das Problem besteht in meinem Fall weiterhin. Ich habe es als separate Frage in stackoverflow.com/questions/61168608/…
Andrus

17

Beachten Sie auch, wenn Sie ausdrücklich gewährt haben:

CONNECT ON DATABASE xxx TO GROUP ,

Sie müssen dies getrennt von DROP OWNED BY widerrufen, indem Sie Folgendes verwenden:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Ich hatte alles oben ausprobiert und es funktionierte einfach immer noch nicht für mich, bis ich ein bisschen weiter nach unten gescrollt habe, also habe ich jetzt noch ein paar Haare übrig. Etwas. : D danke !!
Mitch Kent

6

Ich musste REVOKE noch eine Zeile hinzufügen ...

Nach dem Rennen:

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;

Ich habe immer noch den Fehler erhalten: Benutzername kann nicht gelöscht werden, da einige Objekte davon abhängen. DETAIL: Berechtigungen für das öffentliche Schema

Mir hat das gefehlt:

REVOKE USAGE ON SCHEMA public FROM username;

Dann konnte ich die Rolle fallen lassen.

DROP USER username;

Möglicherweise müssen Sie auch Berechtigungen für 'SCHEMA pg_catalog' widerrufen, wenn Sie beispielsweise einen Benutzer für pg_rewind erstellt haben, der über Berechtigungen für Funktionen wie pg_read_binary_file verfügt.
GreenReaper

5

Folgendes hat endlich für mich funktioniert:

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 ;

2

Da es keine gibt REVOKE ALL PRIVILEGES ON ALL VIEWS, endete ich mit:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

und üblich:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

damit Folgendes gelingt:

drop role "XUSER";

0

In der Befehlszeile dropusersteht ein Befehl zum Löschen von Benutzern aus Postgres zur Verfügung.

$ dropuser someuser

-19

Ich stand vor dem gleichen Problem und fand nun einen Weg, es zu lösen. Zuerst müssen Sie die Datenbank des Benutzers löschen, den Sie löschen möchten. Dann kann der Benutzer leicht gelöscht werden.

Ich habe einen Benutzer namens "msf" erstellt und eine Weile versucht, den Benutzer zu löschen und neu zu erstellen. Ich folgte den folgenden Schritten und wurde erfolgreich.

1) Löschen Sie die Datenbank

dropdb msf

2) Lassen Sie den Benutzer fallen

dropuser msf

Jetzt habe ich den Benutzer erfolgreich fallen lassen.


2
Dies ist ein unglaublicher Slash-and-Burn-Ansatz, da ich das Datenbankschema für jede Iteration meiner Arbeit neu erstellen müsste. (Dazu gehörten fein abgestimmte Berechtigungen für ein vorhandenes Datenbankschema, dh es ist am besten, wenn das Datenbankschema unberührt bleibt.)
Millimoose
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.