PostgreSQL verificare le permission

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

Lascia un commento