34 Stimmen

Wie erstellt man einen Benutzer mit Leseberechtigung für alle Datenbanken in Postgresql?

Ich möchte einen Benutzer erstellen, der nur über eine Auswahlberechtigung für alle Tabellen in allen Datenbanken verfügt. Ich dachte, ich könnte eine Liste von Datenbanken erhalten und den folgenden Befehl für jede Datenbank anwenden:

GRANT select ON DATABASE dbname to user1;

Ich erhalte jedoch die folgende Fehlermeldung:

ERROR:  invalid privilege type SELECT for database

Als ich gegoogelt habe, rieten mir die Leute, das grant select Operation für alle Tabellen. Aber es werden ständig neue Tabellen hinzugefügt. Dies ist also keine akzeptable Lösung für mich. Kennt jemand eine Umgehungslösung?

34voto

IMSoP Punkte 76434

Sie müssen 2 Dinge tun: erstens den Zugriff auf bestehende Objekte erlauben und zweitens den Standardzugriff für neue Objekte festlegen, die von nun an erstellt werden.

Beachten Sie, dass die Gewährung des Zugriffs auf "TABLES" die Ansichten einschließt, aber nicht die Sequenzen (wie z.B. die Auto-Inkrement-Funktion für "SERIAL"-Spalten), so dass Sie wahrscheinlich auch für diese den Zugriff gewähren wollen.

Im Folgenden wird davon ausgegangen, dass Sie alles in der public Schema. Die Website ALTER DEFAULT PRIVILEGES Anweisung kann auf die gesamte Datenbank wirken, indem die IN SCHEMA ... Klausel; die GRANT muss für jedes Schema einmal ausgeführt werden.

-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT
ON TABLES 
TO user1;

-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT, USAGE
ON SEQUENCES 
TO user1;

PostgreSQL-Handbuch

33voto

a_horse_with_no_name Punkte 489934

Sie können dies nicht auf Datenbankebene tun, sondern nur auf Schemaebene.

Angenommen, Sie verwenden nur die public Schema in jeder Datenbank zu erstellen, können Sie dies tun:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;

4voto

Ich weiß, dass Sie bereits gesagt haben, dass dies keine akzeptable Antwort ist, aber es ist trotzdem die richtige Antwort.

Die Festlegung der Sicherheit (GRANT und REVOKE) ist Teil des Tabellenentwurfs und der Tests.

Verschieben Sie Tabellen nicht in die Produktion, bevor Tabellendefinitionen, Sicherheit, Tests und Testdaten unter Versionskontrolle sind.

Allerdings hat PostgreSQL keine SELECT-Berechtigungen für Datenbanken. Sie können nur CREATE-, CONNECT- oder TEMP-Berechtigungen für Datenbanken erteilen.

Sie können SELECT auf alle Tabellen in einem bestimmten Schema gewähren. Ich weiß nicht, wie sich das auf Tabellen auswirkt, die nach dem Ausführen der GRANT-Anweisung erstellt wurden, aber es ist recht einfach zu testen.

PostgreSQL Grant-Syntax

4voto

Vishnu Kumar Punkte 356

Für Postgres-Versionen kleiner als 9.0:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME

4voto

exud Punkte 521

Ich führe die nächsten Schritte aus, um einen schreibgeschützten Benutzer zu erstellen:

your_user erstellen:

1. createuser --interactive --pwprompt

Gehen Sie zu postgresql in your_databases:

2. psql your_database                      

Zugangsprivilegien definieren:

3. GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user; 

Standardzugriffsrechte definieren:

4. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO your_user;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X