In postgreSQL come in tutti i database che si rispettano è possibile gestire le autorizzazioni,
Quello che voglio farvi vedere oggi è come visualizzare le autorizzazioni di un utente.
La prima cosa che ci serve sapere è se il nostro utente può fare il login al nostro server (o cluster che dir si voglia) per questo dobbiamo interrogare la vista del catalogo di progres che si chiama pg_roles (per i dettagli http://www.postgresql.org/docs/9.3/static/view-pg-roles.html) .
A questo punto per sapere i diritti che abbiamo sui database del server dobbiamo interrogare la tabella pg_database che nella colonna datacl memorizza un array con le informazioni che ci servono. Per listare l’array dobbiamo usare una funzone apposta la unnest e quindi una query del tipo : :
SELECT datname, unnest(datacl)AS acl FROM pg_database
ci ritornerà tutte le ACL (Access Control List) di tutti i database del nostro server, la singola ACL và interpretata per comodità riporto da http://www.postgresql.org/docs/9.3/static/sql-grant.html la spiegazione:
rolename=xxxx -- privileges granted to a role =xxxx -- privileges granted to PUBLIC r -- SELECT ("read") w -- UPDATE ("write") a -- INSERT ("append") d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects) * -- grant option for preceding privilege /yyyy -- role that granted this privilege
Postgres ci mette a disposizione anche una nutrita serie di funzioni di sistema per verificare i permessi di un utente (http://www.postgresql.org/docs/current/interactive/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE)
Per avere tutta la situazione sotto controllo seggerisco di interrogare il catalogo di postgres con la seguente query:
SELECT relname , unnest(relacl) as acl FROM pg_class WHERE relkind IN ('r', 'v', 'S') AND relname !~ '^pg_' ORDER BY relname