# PostgreSQL Prático/DCL/Administração de usuários, grupos e privilégios
## 7.1 - Usuários, grupos e privilégios

DCL é formado por um grupo de comandos SQL, responsáveis pela administração dos usuários, dos grupos e das permissões.
De fora do psql (no prompt) utiliza-se comandos sem espaço:
createdb, dropdb, etc.
De dentro do psql os comandos são formados por duas palavras:
CREATE DATABASE, DROP DATABASE, etc (sintaxe SQL).
De dentro do psql:
CREATE USER é agora um alias para CREATE ROLE, que tem mais recursos.
banco=# \h create role
Comando: CREATE ROLE
Descrição: define um novo papel (role) do banco de dados
Sintaxe:
CREATE ROLE nome [ [ WITH ] opção [ ... ] ]
onde opção pode ser:
Caso não seja fornecido ENCRYPTED ou UNENCRYPTED então será usado o valor do parâmetro password_encryption (postgresql.conf).
Criar Usuário
CREATE ROLE nomeusuario;
Nas versões anteriores usava-se o parâmetro “CREATEUSER” para indicar a criação de um superusuário, agora usa-se o parâmetro mais adequado SUPERUSER.
Para poder criar um novo usuário local, com senha, devemos setar antes o pg_hba.conf:
local all all 127.0.0.1/32 password
Comentar as outras entradas para conexão local.
Isso para usuário local (conexão via socket UNIX).
Criamos assim:
CREATE ROLE nomeuser WITH ENCRYPTED PASSWORD '********';
Ao se logar: psql -U nomeuser nomebanco.
CREATE ROLE nomeusuario VALID UNTIL 'data'
Excluindo Usuário
DROP USER nomeusuario;
Como usuário, fora do psql:
Criar Usuário
CREATEROLE nomeusuario;
Excluindo Usuário
DROPUSER nomeusuario;
Detalhe: sem espaços.
Criando Superusuário
CREATE ROLE nomeuser WITH SUPERUSER ENCRYPTED PASSWORD '******';
-- usuário com poderes de super usuário
Alterar Conta de Usuário
ALTER ROLE nomeuser ENCRYPTED PASSWORD '******' CREATEUSER
-- permissão de criar usuários
ALTER ROLE nomeuser VALID UNTIL '12/05/2006';
ALTER ROLE fred VALID UNTIL ’infinity’;
ALTER ROLE miriam CREATEROLE CREATEDB; -- poderes para criar bancos
Obs.: Lembrando que ALTER ROLE é uma extensão do PostgreSQL.
Listando todos os usuários:
SELECT usename FROM pg_user;
A tabela pg_user é uma tabela de sistema (_pg) que guarda todos os usuários do PostgreSQL.
Também podemos utilizar:
\du ou \dg
Criando Um Grupo de usuários
CREATE GROUP nomedogrupo;
Adicionar/Remover Usuários de um Grupo
ALTER GROUP nomegrupo ADD USER user1, user2,user3 ;
ALTER GROUP nomegrupo DROP USER user1, user2 ;
Excluindo Grupo
DROP GROUP nomegrupo;
Obs.: isso remove somente o grupo, não remove os usuários.
Listando todos os grupos:
SELECT groname FROM pg_group;
Privilégios
Dando Privilégios A Um Usuário
GRANT UPDATE ON nometabela TO nomeusuario;
Dando Privilégios A Um Grupo Inteiro
GRANT SELECT ON nometabela TO nomegrupo;
Removendo Todos os Privilégios de Todos os Users
REVOKE ALL ON nometabela FROM PUBLIC
Privilégios
O superusuário tem direito a fazer o que bem entender em qualquer banco de dados do SGBD.
O usuário que cria um objeto (banco, tabela, view, etc) é o dono do objeto.
Para que outro usuário tenha acesso ao mesmo deve receber privilégios.
Existem vários privilégios diferentes: SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES, TRIGGER, CREATE, TEMPORARY, EXECUTE e USAGE.
Os privilégios aplicáveis a um determinado tipo de objeto variam de acordo com o tipo do objeto (tabela, função, etc.).
O comando para conceder privilégios é o GRANT. O de remover é o REVOKE.
GRANT UPDATE ON contas TO joel;
Dá a joel o privilégio de executar consultas update no objeto contas.
GRANT SELECT ON contas TO GROUP contabilidade;
REVOKE ALL ON contas FROM PUBLIC;
Os privilégios especiais do dono da tabela (ou seja, os direitos de DROP, GRANT, REVOKE, etc.) são sempre inerentes à condição de ser o dono, não podendo ser concedidos ou revogados. Porém, o dono do objeto pode decidir revogar seus próprios privilégios comuns como, por exemplo, tornar a tabela somente para leitura para o próprio, assim como para os outros.
Normalmente, só o dono do objeto (ou um superusuário) pode conceder ou revogar privilégios para um objeto.
-- Criação dos grupos
CREATE GROUP adm;
CREATE USER paulo ENCRYPTED PASSWORD 'paulo' CREATEDB CREATEUSER;
-- Criação dos Usuários do Grupo adm
CREATE USER andre ENCRYPTED PASSWORD 'andre' CREATEDB IN GROUP adm;
CREATE USER michela ENCRYPTED PASSWORD 'michela' CREATEDB IN GROUP adm;
O usuário de sistema (super usuário) deve ser um usuário criado exclusivamente para o PostgreSQL. Nunca devemos torná-lo dono de nenhum executável.
Os nomes de usuários são globais para todo o agrupamento de bancos de dados, ou seja, podemos utilizar um usuário com qualquer dos bancos.
Os privilégios DROP, GRANT, REVOKE, etc pertencem ao dono do objeto não podendo ser concedidos ou revogados. O máximo que um dono pode fazer é abdicar de seus privilégios e com isso ninguém mais teria os mesmos e o objeto seria somente leitura para todos.
Exemplo: para permitir a um usuário apenas os privilégios de INSERT, UPDATE e SELECT e não permitir o de DELETE em uma tabela, use:
REVOKE ALL ON tabela FROM usuario;
GRANT SELECT,UPDATE,INSERT ON tabela TO usuario;
Mais detalhes:
http://pgdocptbr.sourceforge.net/pg80/user-manag.html
http://pgdocptbr.sourceforge.net/pg80/sql-revoke.html
http://pgdocptbr.sourceforge.net/pg80/sql-grant.html