Quando os privilégios estão listados em \ l e quando não?

10

Quando os privilégios de acesso estão listados por \ l e quando não estão? Os privilégios de acesso listados por \ l podem mudar após uma concessão e revogar:

$ 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

Por que é que? Que estado mudou? Acredito que a capacidade do usuário my_readonly de se conectar permaneceu inalterada durante toda a sessão psql (porque acho que a função PUBLIC tem privilégios de conexão), mas claramente algo mudou: o que é isso?

Pergunta Side: como posso pedir explicitamente postgres se PÚBLICO na verdade não tem privilégios de conexão (que pode ter sido revogada - ver Por que um novo usuário selecionar a partir de qualquer tabela? )?

Croad Langshan
fonte

Respostas:

4

Os comandos de barra invertida no psql são atalhos para uma consulta ou consultas que examinam os catálogos do sistema. O \lcomando examina as informações pg_catalog.pg_database, especificamente, nesta consulta:

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;

Você pode psqlmostrar o que está usando para os comandos de barra invertida, passando o -Esinalizador para ele quando você o chama na linha de comando.

Se as permissões em um banco de dados ou outro objeto são os padrões com os quais o PostgreSQL as cria, a *aclcoluna será NULL. Se você alterar os padrões, como você fez, a coluna ACL será preenchida com informações relacionadas às instruções GRANTe / ou REVOKEexecutadas.

Você pode ver as permissões / ACLs especificamente por meio de \zou\dp

Se você ler mais aqui:

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

Se você rolar para baixo (ou procurar a palavra psql), poderá ver a tabela que mostra como interpretar as ACLs que você vê com \lou em uma coluna da ACL.

Por exemplo:

=Tc/vagrant

significa que PUBLIC (a função implícita que contém todas as funções) tem permissões para criar tabelas temporárias Te conectar-se c, porque a linha ACL =xxxxxindica permissões aplicadas a PUBLIC, enquanto rolname=xxxxse aplica a essa função específica.

Esta apresentação do Dalibo também deve ajudar a esclarecer isso ainda mais: Gerenciando direitos no PostgreSQL

Espero que ajude. =)

Kassandry
fonte