Узнайте, получил ли пользователь разрешение на выбор / обновление / ... таблицы / функции/… в PostgreSQL
-
09-09-2019 - |
Вопрос
Каков рекомендуемый способ выяснить, получил ли пользователь определенное право (напримервыбрать или выполнить) для определенного класса (например,таблица или функция) в PostgreSQL?
На данный момент я получил что-то вроде
aclcontains(
someColumnWithAclitemArray,
makeaclitem(userOid,grantorOid,someRight,false))
но это ужасно, так как я должен проверять каждый grantorOid
это возможно и для каждого userOid
пользователь может принадлежать.
На соответствующей ноте:на какие возможные права вы можете протестировать?Я не нашел никакой документации, но, полагаю, читаю исходный код:
INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT
Также, по - видимому, существует CREATE TEMP
верно, но я не могу определить правильный текст для использования в makeaclitem
-функция.
Решение
Я обнаружил, что лучший подход (и я, кажется, помню, что это было взято из некоторых запросов, встроенных в 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')
.
Другие советы
Взгляните на "Функции запроса прав доступа" а также тот "ГРАНТ" справочная страница.