2009-06-03 15 views
11

Qual è il modo consigliato di capire se un utente ha un certo diritto (ad esempio selezionare o eseguire) su un certa classe (es. tabella o funzione) in PostgreSQL?Scopri se l'utente ha il permesso di selezionare/aggiornare/... una tabella/funzione/... in PostgreSQL

Al momento ho ottenuto qualcosa come

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

ma è terribile da quando devo controllare per ogni grantorOid che è possibile e per ogni userOid l'utente può appartenere a.

Su una nota correlata: quali sono i possibili diritti per i quali è possibile eseguire il test? Non ho trovato alcuna documentazione ma leggendo il codice sorgente immagino:

INSERT 
SELECT 
UPDATE 
DELETE 
TRUNCATE 
REFERENCES 
TRIGGER 
EXECUTE 
USAGE 
CREATE 
CONNECT 

Ci sembra anche essere un diritto CREATE TEMP, ma io non riesco a capire il testo corretto da utilizzare nel makeaclitem -funzione.

risposta

17

Ho trovato che un approccio migliore (e mi sembra di ricordare che questo è stato preso da alcune query incorporate in psql, o forse le viste information_schema) è quello di utilizzare le funzioni has_*_privilege e semplicemente applicarle a un insieme di tutte possibili combinazioni di utente e oggetto. Questo terrà conto di avere accesso ad un oggetto tramite qualche ruolo di gruppo.

Ad esempio, questo mostrerà quali utenti hanno accesso a quali tabelle fuori catalogo e viste:

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; 

Le possibili privilegi sono dettagliate nella descrizione delle funzioni has_*_privilegehttp://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

'CREATE TEMP' è un privilegio a livello di database: consente a un utente di utilizzare uno schema pg_temp_*. Può essere testato con has_database_privilege(useroid, datoid, 'TEMP').

Problemi correlati