Gewähren eines Zugriffs auf alle Tabellen für einen Benutzer

151

Ich bin neu bei Postgres und versuche, unsere MySQL-Datenbanken zu migrieren. In MySQL kann ich gewähren SELECT, UPDATE, INSERT, und DELETEPrivilegien auf einem niedrigen privilegierten Benutzern und diese Zuschüsse ermöglichen, alle Tabellen in einer bestimmten Datenbank zu übernehmen. Ich muss etwas in Postgres vermissen, weil es so aussieht, als müsste ich diese Rechte für jeden Tisch einzeln vergeben. Mit vielen Datenbanken und Hunderten von Tabellen pro Datenbank scheint dies eine entmutigende Aufgabe zu sein, nur um den Anfang zu machen. Sobald eine Datenbank in Betrieb ist, kommt es außerdem häufig genug vor, dass ich nicht jedes Mal Berechtigungen erteilen müsste, es sei denn, dies ist unbedingt erforderlich.

Wie wird das am besten erreicht?

PlaidFan
quelle

Antworten:

175

Zunächst müssen Sie eine Verbindung zur Datenbank herstellen können, um Abfragen ausführen zu können. Dies kann erreicht werden durch

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

Das REVOKEist nötig weil

Das Schlüsselwort PUBLIC gibt an, dass die Berechtigungen für alle Rollen erteilt werden sollen, einschließlich der Rollen, die später erstellt werden. PUBLIC kann als implizit definierte Gruppe betrachtet werden, die immer alle Rollen enthält. Jeder bestimmten Rolle werden die Summe der direkt zugewiesenen Berechtigungen, der Berechtigungen für jede Rolle, der sie gegenwärtig angehört, und der PUBLIC zugewiesenen Berechtigungen zugewiesen.

Wenn Sie Ihren Benutzer wirklich auf DML-Anweisungen beschränken möchten, müssen Sie ein wenig mehr tun:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Hierbei wird davon ausgegangen, dass Sie nur ein Schema haben (das standardmäßig den Namen "public" trägt).

Wie Jack Douglas betonte, gibt das Obige nur die Privilegien für die bereits existierenden Tische. Um dasselbe für zukünftige Tabellen zu erreichen, müssen Sie Standardberechtigungen definieren :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Hier some_roleist eine Rolle, die die Tabellen erstellt, während user_namediejenige, die die Berechtigungen erhält. Um dies zu definieren, müssen Sie als some_roleMitglied angemeldet sein .

Und schließlich müssen Sie dasselbe für die Sequenzen tun (danke an PlaidFan für den Hinweis) - hier ist es das USAGEPrivileg, das Sie brauchen.

dezso
quelle
1
Vielen Dank, FOR some_rolewar der Schlüsselteil, den ich vermisst habe, damit es für meine später erstellten Tabellen funktioniert. Aber ich musste nicht eingeloggt sein some_role, es funktionierte auch, wenn ich die Abfrage als Standardadministrator ausführte postgres.
JustAMartin
54

Angenommen, Sie möchten ihnen alle Berechtigungen erteilen - gehen Sie wie folgt vor:

grant all privileges on database dbname to dbuser;

Wo dbnameist der Name Ihrer Datenbank und dbuserist der Name des Benutzers.

Alxkls
quelle
44
Dadurch werden die folgenden Berechtigungen auf der hinzufügen Datenbank : CREATE, CONNECT, TEMPORARY. Keine Berechtigungen für Tabellen.
Dezso
13
Ein ähnlicher Befehl für alle Tische wäre,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci
5
Ich fand das auch nützlich:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo
18

Das Gewähren aller Berechtigungen für alle Tabellen in der Datenbank erfolgt mit

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
Nomadme
quelle
15

Es kann sein, dass ich hier etwas falsch gemacht habe, da ich für PostgreSQL sehr neu bin. Dies löste jedoch nur den ersten Teil des Problems für mich - das Festlegen der Berechtigungen für alle vorhandenen Tabellen.

Damit die Berechtigungen für meinen Benutzer für neue Tabellen, die erstellt werden, korrekt festgelegt werden, muss ich die Standardberechtigungen für den Benutzer festlegen:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;
Wille
quelle
2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Jorge Valenzuela
quelle