2009-06-03 5 views
11

Каков рекомендуемый способ выяснить, получил ли пользователь определенное право (например, выбрать или выполнить) на определенный класс (например, таблица или функция) в PostgreSQL?Узнайте, есть ли у пользователя разрешение на выбор/обновление/... таблица/функция/... в PostgreSQL

На данный момент я получил что-то вроде

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

, но это ужасно, так как я должен проверить для каждого grantorOid, что возможно, и для каждого userOid пользователь может принадлежать.

Относительно примечания: какие возможные права вы можете проверить? я не нашел никаких документов, кроме чтения исходного кода я думаю:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

Там также, кажется, быть CREATE TEMP право, но я не могу понять, правильный текст для использования в makeaclitem -функции.

ответ

17

Я нашел, что лучший подход (и я, кажется, помню, что это было взято из некоторых запросов, встроенных в psql, или, возможно, из представлений information_schema), должно использовать функции has_*_privilege и просто применять их к набору всех возможные комбинации пользователя и объекта. Это будет учитывать наличие доступа к объекту через некоторую роль группы.

Например, это покажет, какие пользователи имеют доступ к которой не-каталог таблиц и представлений:

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; 

Возможные льготы детализированы в описании has_*_privilege функций на http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

«CREATE TEMP» - это привилегия на уровне базы данных: он позволяет пользователю использовать схему pg_temp_*. Его можно протестировать с помощью has_database_privilege(useroid, datoid, 'TEMP').