Wann sind Berechtigungen in \ l aufgeführt und wann nicht?

10

Wann werden Zugriffsrechte von \ l aufgelistet und wann nicht? Die von \ l aufgelisteten Zugriffsrechte können sich nach einer Erteilung ändern und widerrufen:

$ createuser -EP my_readonly
$ psql development
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
...
development=# grant usage on schema public to my_readonly;
development=# grant connect on database development to my_readonly;
development=# \l
                                             List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges      
-----------------------------+----------+----------+-------------+-------------+----------------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant               +
                             |          |          |             |             | vagrant=CTc/vagrant       +
                             |          |          |             |             | my_readonly=c/vagrant
...
development=# revoke connect on database development from my_readonly;
REVOKE
development=# revoke usage on schema public from my_readonly;
REVOKE
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant          +
                             |          |          |             |             | vagrant=CTc/vagrant

Warum das? Welcher Zustand hat sich geändert? Ich glaube, die Fähigkeit des my_readonly-Benutzers, eine Verbindung herzustellen, war während dieser gesamten psql-Sitzung unverändert (da ich vermute, dass die PUBLIC-Rolle Verbindungsberechtigungen hat), aber eindeutig hat sich etwas geändert: Was ist das für ein Ding?

Seite Frage: Wie kann ich explizit fragen , ob Postgres PUBLIC in der Tat nicht connect Rechte haben (sie widerrufen haben - siehe Warum ein neuer Benutzer aus einer Tabelle auswählen können? )?

Croad Langshan
quelle

Antworten:

4

Die Backslash-Befehle in psql sind Verknüpfungen für eine Abfrage oder Abfragen, die die Systemkataloge durchsuchen. Der \lBefehl untersucht Informationen in pg_catalog.pg_databasedieser Abfrage:

SELECT d.datname as "Name",
   pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
   pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
   d.datcollate as "Collate",
   d.datctype as "Ctype",
   pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;

Sie können psqlzeigen, was für die Backslash-Befehle verwendet wird, indem Sie das -EFlag übergeben, wenn Sie es in der Befehlszeile aufrufen.

Wenn die Berechtigungen für eine Datenbank oder ein anderes Objekt die Standardeinstellungen sind, mit denen PostgreSQL sie erstellt, lautet die *aclSpalte NULL. Wenn Sie die Standardeinstellungen wie bisher ändern, wird die ACL-Spalte mit Informationen zu den von Ihnen ausgeführten GRANTund / oder REVOKEAnweisungen gefüllt.

Sie können die Berechtigungen / ACLs speziell über entweder \zoder anzeigen\dp

Wenn Sie hier weiter lesen:

http://www.postgresql.org/docs/9.4/static/sql-grant.html

Wenn Sie nach unten scrollen (oder nach dem Wort psqlsuchen), können Sie sich die Tabelle ansehen, in der Sie sehen, wie Sie die ACLs interpretieren, die Sie mit \loder in einer ACL-Spalte sehen.

Beispielsweise:

=Tc/vagrant

bedeutet, dass PUBLIC (die implizite Rolle, die alle Rollen enthält) Berechtigungen zum Erstellen temporärer Tabellen Tund zum Verbinden hat c, da die ACL-Zeile =xxxxxBerechtigungen angibt, die auf PUBLIC angewendet werden, während sie rolname=xxxxfür diese bestimmte Rolle gilt.

Diese Präsentation von Dalibo soll auch dazu beitragen, dies weiter zu verdeutlichen: Verwalten von Rechten in PostgreSQL

Ich hoffe, das hilft. =)

Kassandry
quelle