2009-06-03 9 views
11

Was ist die empfohlene Methode, um herauszufinden, ob ein Benutzer ein bestimmtes Recht (z. B. auswählen oder ausführen) auf a bestimmte Klasse (zB Tabelle oder Funktion) in PostgreSQL?Finden Sie heraus, ob Benutzer die Berechtigung zum Auswählen/Aktualisieren/... einer Tabelle/Funktion/... in PostgreSQL erhalten hat.

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 userOid der Benutzer gehören.

Zu einem verwandten Hinweis: Was sind die möglichen Rechte, die 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 dem makeaclitem -function zu verwenden.

Antwort

17

ich, dass ein besserer Ansatz gefunden habe (und ich scheinen dies von einigen Abfragen in psql, oder vielleicht die information_schema Ansichten gebaut genommen zu erinnern) ist zu verwenden, um die has_*_privilege Funktionen und einfach anwenden sie auf einen Satz von allen mögliche Kombinationen von Benutzer und Objekt. Dies berücksichtigt den Zugriff auf ein Objekt über eine Gruppenrolle.

Zum Beispiel wird dies zeigen, welche Benutzer welche zu nicht-Katalogtabellen und Ansichten zugreifen:

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 Privilegien sind in der Beschreibung der has_*_privilege Funktionen bei http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

"CREATE TEMP" ist eine Berechtigung auf Datenbankebene: Es ermöglicht einem Benutzer, ein pg_temp_* Schema zu verwenden. Es kann mit has_database_privilege(useroid, datoid, 'TEMP') getestet werden.