2009-06-03 16 views
11

Jaki jest zalecany sposób ustalenia, czy użytkownik otrzymał określone prawo (np. Wybierz lub wykonaj) pewna klasa (np. tabela lub funkcja) w PostgreSQL?Sprawdź, czy użytkownik ma uprawnienia do wybierania/aktualizowania/... tabeli/funkcji/... w PostgreSQL

W tej chwili mam coś jak

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

ale to jest straszne, ponieważ mam do sprawdzenia każdego grantorOid że jest to możliwe i za każdym userOid użytkownik może należeć do.

W powiązanej notatce: jakie są możliwe prawa, które można przetestować? nie znalazłem żadnej dokumentacji, ale odczytanie kodu źródłowego ja zgadnę:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

Istnieje również wydaje się być CREATE TEMP rację, ale nie mogę dowiedzieć się prawidłowy tekst do wykorzystania w makeaclitem -function.

Odpowiedz

17

Zauważyłem, że lepszym podejściem (i wydaje mi się, że pamiętam, że zostało to wzięte z niektórych zapytań wbudowanych w psql, a może widoki informacji) jest użycie funkcji has_*_privilege i po prostu zastosowanie ich do zestawu wszystkich możliwe kombinacje użytkownika i obiektu. Uwzględni to również dostęp do obiektu za pośrednictwem pewnej roli grupowej.

Na przykład ten pokazuje, którzy użytkownicy mają dostęp do których nie katalogowych tabel i widoków:

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; 

Możliwe przywileje są wyszczególnione w opisie funkcji has_*_privilege w http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

'CREATE TEMP' to przywilej na poziomie bazy danych: umożliwia użytkownikowi korzystanie ze schematu pg_temp_*. Można go przetestować pod numerem has_database_privilege(useroid, datoid, 'TEMP').

Powiązane problemy