FEHLER: Berechtigung für Beziehungstabellenname auf Postgres verweigert, während SELECT als schreibgeschützter Benutzer versucht wird

88
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Der schreibgeschützte Benutzer kann eine Verbindung herstellen, siehe Tabellen, aber wenn er versucht, eine einfache Auswahl zu treffen, erhält er:

ERROR: permission denied for relation mytable
SQL state: 42501

Dies geschieht unter PostgreSQL 9.1

Was habe ich falsch gemacht?

Sorin
quelle
1
Können Sie einige Details zu "Relation Mytable" angeben? Schema, ist es eine "echte" Tabelle (oder eine Ansicht / Funktion), löst aus ...
Igor Romanchenko

Antworten:

161

Hier ist die Komplettlösung für PostgreSQL 9+, die kürzlich aktualisiert wurde.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Vielen Dank an https://jamie.curle.io/creating-a-read-only-user-in-postgres/ für einige wichtige Aspekte

Wenn jemand kürzeren Code findet und vorzugsweise einen, der dies für alle vorhandenen Datenbanken ausführen kann, ein zusätzliches Lob.

Sorin
quelle
6
Beinhaltet dies Ansichten?
Frank Conry
8
Warum GRANT ALLerteilen Sie dem schreibgeschützten Benutzer standardmäßig die Berechtigung?
Slava Fomin II
1
Ich gab genau so, wie es definiert ist, immer noch den Sam-Fehler
Anish Gopinath
kann gewährte Rechte mit bestätigen \ddp. Sollte genau =r/wie granting_user=r/readonly_userbei schreibgeschütztem Zugriff angezeigt werden.
Greg Bray
Dies ist wörtlich SQL aus der Frage. Ich sehe nicht, wie es eine Lösung bietet.
r351574nc3
12

Versuchen Sie hinzuzufügen

GRANT USAGE ON SCHEMA public to readonly;

Sie waren sich wahrscheinlich nicht bewusst, dass Sie die erforderlichen Berechtigungen für ein Schema benötigen, um Objekte im Schema verwenden zu können.

sufleR
quelle
Es passiert etwas Seltsames. Ich führe diese Befehle auf dem Server psqlals postgresBenutzer aus und erhalte eine ordnungsgemäße Antwort.GRANT . Wenn ich jedoch auf die ACL in den Tabellen schaue, sehe ich nur zwei andere Konten, eines ist der Datenbankeigentümer jirauserund ein anderes schreibgeschütztes Konto mit dem Namen qauser. Aber meine readonlyerscheint dort nicht. Postgres ist Version 9.1 und ich habe sogar den Server neu gestartet, es passiert immer noch nichts.
Sorin
2
Was ist / war die Ausgabe von \ du in der psql-Konsole? Können Sie diese Ausgabe noch geben oder ist sie bereits wie in Ihrer Antwort behoben?
SufleR
Ich weiß nicht wirklich, was passiert ist, da die Ausgabe korrekt war (GRANT). Gestern hat es nicht funktioniert, aber heute hat es funktioniert, nachdem wieder alle 3 Befehle ausgeführt wurden.
Sorin
3
Hinweis: Die erwartete Antwort darauf ist einfach 'GRANT'. Wenn Sie "WARNUNG: Für" public "wurden keine Berechtigungen erteilt" angezeigt, hat dies NICHT funktioniert. Der schreibgeschützte Benutzer kann sich keine zusätzlichen Berechtigungen erteilen. Dies kann nur ein Benutzer mit 'GRANT'-Berechtigungen tun, sodass Sie sich wahrscheinlich als Superuser anmelden müssen.
PeterVermont
Hallo, wenn ich versuche, SELECT ON ALL TABLES IN SCHEMA public TO postgres zu gewähren; es antwortet: FEHLER: Berechtigung für Relation Databasechangeloglock verweigert. Weißt du was ich falsch mache? Danke (es passiert auf GAppEngine Posgres9.6 unter Verwendung der öffentlichen Adresse und Zugriff über das Terminal)
Mike
-5

Das hat bei mir funktioniert:

Überprüfen Sie die aktuelle Rolle, bei der Sie angemeldet sind, indem Sie Folgendes verwenden: SELECT CURRENT_USER, SESSION_USER;

Hinweis : Es muss mit dem Eigentümer des Schemas übereinstimmen.

Schema | Name | Geben Sie | ein Besitzer
-------- + -------- + ------- + ----------

Wenn der Eigentümer anders ist, geben Sie alle Berechtigungen für die aktuelle Benutzerrolle von der Administratorrolle durch:

GRANT 'ROLE_OWNER' an 'CURRENT ROLENAME';

Versuchen Sie dann, die Abfrage auszuführen. Sie gibt die Ausgabe aus, da sie jetzt Zugriff auf alle Beziehungen hat.

Dhwani Shah
quelle
5
Das Ändern des Besitzers in einen Benutzer namens readonly klingt kaum nach der richtigen Lösung.
Anna
Abhängig von Ihrem Fall kann ein falscher Tischbesitzer tatsächlich die Ursache sein (es war mir ein Feind). Richtige Methode zum Ändern der Tabellenbesitzer in PostgreSQL: siehe stackoverflow.com/a/13535184
Tanius
-6

Stellen Sie sicher, dass Ihr Benutzer Attribute für seine Rolle hat. beispielsweise:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

nach dem Ausführen des folgenden Befehls:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

es hat das Problem behoben.

Rollen und Dinge finden Sie im Tutorial hier: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2

PuN1sh3r
quelle
18
Nein! Es ist nicht die richtige Lösung, einem Benutzer mit dem Namen "schreibgeschützt" die Superuser-Rolle zu geben, um eine "Auswahl" durchzuführen.
Anna
@Anna Das passiert hier nicht. In diesem Thread geht es nicht darum, schreibgeschützten Zugriff zu gewähren. In diesem Thread geht es darum, einem Benutzer Zugriff zu gewähren, um einem anderen Benutzer schreibgeschützten Zugriff zu gewähren. IMHO, das ist richtig. Wenn Ihr Benutzer kein Superuser ist, können Sie keinen schreibgeschützten Benutzer erstellen. Der Fehler besteht darin, dass ein schreibgeschützter Benutzer erstellt werden kannERROR: permission denied for relation mytable
r351574nc3
-7

Sie sollten die nächste Abfrage ausführen:

GRANT ALL ON TABLE mytable TO myuser;

Wenn sich Ihr Fehler in einer Ansicht befindet, verfügt die Tabelle möglicherweise nicht über die Berechtigung. Daher sollten Sie die nächste Abfrage ausführen:

GRANT ALL ON TABLE tbm_grupo TO myuser;
ja
quelle
5
Der Benutzer heißt "schreibgeschützt". Es ist zweifelhaft, dass es das Ziel ist, dem Benutzer alle Berechtigungen zu erteilen. Er will nur eine Auswahl treffen.
Anna
Dies macht den Zweck ALTER DROP DELETEzunichte , den Benutzer "ReadOnly" zu nennen, wenn Sie Ect angeben. An diesen Benutzer ...
JayRizzo