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


