Узнайте, получил ли пользователь разрешение на выбор/ обновление / ... таблицы / функции/ ... в 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
-функции.
2 ответа:
Я обнаружил, что лучший подход (и я, кажется, помню, что это было взято из некоторых запросов, встроенных в 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')
.
Взгляните на "функции запроса привилегий доступа", а также на "GRANT" справочную страницу.