Quand les privilèges sont-ils répertoriés dans \ l et quand non?

10

Quand les privilèges d'accès sont-ils répertoriés par \ l et quand ne le sont-ils pas? Les privilèges d'accès répertoriés par \ l peuvent changer après une autorisation et une révocation:

$ createuser -EP my_readonly
$ psql development
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
...
development=# grant usage on schema public to my_readonly;
development=# grant connect on database development to my_readonly;
development=# \l
                                             List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |     Access privileges      
-----------------------------+----------+----------+-------------+-------------+----------------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant               +
                             |          |          |             |             | vagrant=CTc/vagrant       +
                             |          |          |             |             | my_readonly=c/vagrant
...
development=# revoke connect on database development from my_readonly;
REVOKE
development=# revoke usage on schema public from my_readonly;
REVOKE
development=# \l
                                           List of databases
            Name             |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------------------------+----------+----------+-------------+-------------+-----------------------
 development                 | vagrant  | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/vagrant          +
                             |          |          |             |             | vagrant=CTc/vagrant

Pourquoi donc? Quel état a changé? Je crois que la capacité de l'utilisateur my_readonly à se connecter est restée inchangée pendant toute cette session psql (car je suppose que le rôle PUBLIC a des privilèges de connexion), mais clairement quelque chose a changé: quelle est cette chose?

Question Côté: comment puis - je demander explicitement postgres si PUBLIC en fait n'ont des privilèges de connexion (ils ont été révoqués - voir pourquoi un nouvel utilisateur peut choisir parmi une table? )?

Croad Langshan
la source

Réponses:

4

Les commandes de barre oblique inverse dans psql sont des raccourcis pour une ou plusieurs requêtes qui parcourent les catalogues système. La \lcommande examine les informations pg_catalog.pg_database, en particulier, dans cette requête:

SELECT d.datname as "Name",
   pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
   pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
   d.datcollate as "Collate",
   d.datctype as "Ctype",
   pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;

Vous pouvez faire psqlafficher ce qu'il utilise pour les commandes de barre oblique inverse en lui passant le -Edrapeau lorsque vous l'invoquez sur la ligne de commande.

Si les autorisations sur une base de données ou un autre objet sont les valeurs par défaut avec lesquelles PostgreSQL les crée, la *aclcolonne le sera NULL. Si vous modifiez les valeurs par défaut, comme vous l'avez fait, la colonne ACL sera remplie d'informations relatives aux instructions GRANTet / ou que REVOKEvous avez exécutées.

Vous pouvez voir les autorisations / ACL spécifiquement via \zou\dp

Si vous lisez plus loin ici:

http://www.postgresql.org/docs/9.4/static/sql-grant.html

Si vous faites défiler vers le bas (ou recherchez le mot psql), vous pouvez consulter le tableau qui vous montre comment interpréter les ACL que vous voyez avec \lou dans une colonne ACL.

Par exemple:

=Tc/vagrant

signifie que PUBLIC (le rôle implicite qui contient tous les rôles) dispose des autorisations pour créer des tables temporaires Tet se connecter c, car la ligne ACL =xxxxxindique les autorisations appliquées à PUBLIC, tout en rolname=xxxxs'appliquant à ce rôle spécifique.

Cette présentation de Dalibo devrait également aider à clarifier cela davantage: Gestion des droits dans PostgreSQL

J'espère que ça t'as aidé. =)

Kassandry
la source