Scopri se l'utente ha ottenuto il permesso di selezionare / aggiornamento / ... un tavolo / funzione / ... in PostgreSQL

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

Domanda

Qual è il metodo consigliato per capire se un utente ha un certo diritto (per esempio selezionare o eseguire) su una certa classe (per esempio tavolo o funzione) in PostgreSQL?

Al momento ho ricevuto 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.

In una nota correlata: quali sono i possibili diritti è possibile testare per? 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 nella makeaclitem funzione.

È stato utile?

Soluzione

Ho scoperto che un approccio migliore (e mi sembra di ricordare questo è stato preso da alcune query incorporate in psql, o forse le viste INFORMATION_SCHEMA) è quello di utilizzare le funzioni has_*_privilege, e semplicemente applicarli a un insieme di tutti i possibili combinazioni di utente e l'oggetto. Ciò terrà conto di avere accesso ad un oggetto tramite un qualche ruolo gruppo pure.

Per esempio, questo mostra che gli utenti hanno la quale l'accesso alle 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;

I possibili privilegi sono dettagliati nella descrizione delle funzioni has_*_privilege all'indirizzo http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

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

Altri suggerimenti

Date un'occhiata al rel="noreferrer"> e anche il " Grant " pagina di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top