Finde heraus, ob Benutzer die Berechtigung bekam auswählen / update / ... eine Tabelle / Funktion / ... in PostgreSQL

StackOverflow https://stackoverflow.com/questions/946804

Frage

Was ist der empfohlene Weg, um herauszufinden, ob ein Benutzer ein bestimmtes Recht bekam (z wählen oder Ausführen) auf einer bestimmte Klasse (zum Beispiel Tabelle oder Funktion) in PostgreSQL?

Im Moment habe ich so etwas wie

aclcontains(
    someColumnWithAclitemArray,
    makeaclitem(userOid,grantorOid,someRight,false))

aber es ist schrecklich, da ich für jeden grantorOid zu überprüfen, was möglich ist und für jeden den Benutzer userOid kann gehören.

Über einen entsprechenden Hinweis: was sind die möglichen Rechte Sie testen können? Ich habe keine Dokumentation, sondern liest den Quellcode Ich denke, gefunden:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

Es scheint auch ein CREATE TEMP Recht zu sein, aber ich kann nicht den richtigen Text herauszufinden, in der makeaclitem-Funktion zu verwenden.

War es hilfreich?

Lösung

ich, dass ein besserer Ansatz gefunden habe (und ich mich zu erinnern, das von einigen Abfragen in psql, oder vielleicht die information_schema Ansichten gebaut genommen wurde) ist die has_*_privilege Funktionen zu verwenden und einfach anwenden sie auf einen Satz von allen möglichen Kombinationen von Benutzern und Objekt. Dies berücksichtigt auch über einige Gruppenrolle Zugriff auf ein Objekt hat.

Zum Beispiel wird dies zeigen, welche Benutzer haben, die auf nicht-Katalog zugreifen Tabellen und Views:

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

Die möglichen Zugriffsrechte werden in der Beschreibung der has_*_privilege Funktionen detailliert unter http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

‚CREATE TEMP‘ ist ein Datenbank-Level-Privileg: Er erlaubt einen Benutzer ein pg_temp_* Schema zu verwenden. Es kann mit has_database_privilege(useroid, datoid, 'TEMP') getestet werden.

Andere Tipps

Werfen Sie einen Blick auf die “ Zugriffsberechtigungsanfrage Funktionen „ und auch die “ GRANT " Referenzseite.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top