Descubra se o usuário tem permissão para selecionar / update / ... a / função de tabela / ... no PostgreSQL

StackOverflow https://stackoverflow.com/questions/946804

Pergunta

O que é a maneira recomendada para descobrir se um usuário tem um certo direito (por exemplo, selecionar ou executar) em uma determinada classe (por exemplo, tabela ou função) no PostgreSQL?

No momento eu tenho algo como

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

mas é péssima, pois eu tenho que verificar para cada grantorOid que é possível e para cada userOid o usuário pode pertencer a.

Em uma nota relacionada: o que são os direitos possíveis que você pode testar para? Eu não encontrei qualquer documentação, mas a leitura do código fonte que eu acho:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

Há também parece ser um direito CREATE TEMP, mas eu não consigo descobrir o texto correto para uso na função makeaclitem.

Foi útil?

Solução

Descobri que uma abordagem melhor (e eu me lembro este foi tirado de algumas consultas incorporadas psql, ou talvez os pontos de vista information_schema) é usar as funções has_*_privilege, e simplesmente aplicá-los a um conjunto de todos os possíveis combinações de utilizador e objecto. Isto irá ter em conta de ter acesso a um objeto via algum papel grupo também.

Por exemplo, isso vai mostrar que os usuários têm que o acesso a tabelas não-catálogo e exibições:

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;

Os privilégios possíveis são detalhados na descrição das funções has_*_privilege em http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'Criar TEMP' é um privilégio de nível de banco de dados: permite que o usuário utilize um esquema pg_temp_*. Ele pode ser testado com has_database_privilege(useroid, datoid, 'TEMP').

Outras dicas

Dê uma olhada na " acesso Privilege Inquérito funções " e também a " GRANT " página de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top