Узнайте, получил ли пользователь разрешение на выбор / обновление / ... таблицы / функции / ... в PostgreSQL - PullRequest
11 голосов
/ 03 июня 2009

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

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

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

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

В соответствующей заметке: какие права вы можете проверить? Я не нашел никакой документации, но, читая исходный код, я думаю:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

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

Ответы [ 2 ]

18 голосов
/ 04 июня 2009

Я обнаружил, что лучший подход (и я помню, что он был взят из некоторых запросов, встроенных в 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').

6 голосов
/ 04 июня 2009

Посмотрите «Функции запроса прав доступа» , а также справочную страницу «GRANT» .

...