Conceder direitos no banco de dados postgresql para outro usuário

4

Estou tentando configurar um sistema com um banco de dados PostgreSQL por usuário, com um pool de recursos PHP-FPM para uma conta associada. Eu preciso conceder todos os privilégios no banco de dados para o outro usuário, mas parece que só é possível fazer isso para tabelas.

Eu tentei

grant all privileges on database username to username_shadow

mas isso oferece apenas privilégios limitados.

Eu fiz o upgrade para o PGSQL 9.2, que tem a capacidade de conceder privilégios no esquema, mas não consigo obter um resultado útil. Como faço para que outro usuário tenha todos os privilégios do primeiro no mesmo banco de dados?

    
por Austin 30.11.2012 / 10:43

1 resposta

7

Não tente duplicar conjuntos de direitos como este, isso se tornará um pesadelo gerencial. Use papéis e herança.

Em vez disso, crie um ROLE (group) e torne ambos os usuários membros da função. Conceda à função os direitos necessários e a propriedade de quaisquer objetos exigidos, e os usuários herdarão automaticamente esses direitos de acesso.

Para fazer a transição:

  • Transforme o usuário existente na função compartilhada renomeando-o e descartando seu LOGIN para a direita, transformando-o de uma função de login (usuário) em uma função de não-login (grupo) e crie um novo usuário o nome original; ou

  • Manualmente GRANT da nova função todos os direitos necessários, usando GRANT ... ON DATABASE , GRANT ... ON SCHEMA , GRANT ... ON ALL TABLES IN SCHEMA , etc.

Aqui está uma demonstração da primeira abordagem. Digamos que temos um usuário original chamado test com a propriedade de uma tabela e algumas outras concessões:

regress=# CREATE USER test WITH PASSWORD 'original user pw';
CREATE ROLE
regress=# CREATE TABLE testtab(x integer);
CREATE TABLE
regress=# ALTER TABLE testtab OWNER TO test;
ALTER TABLE

Podemos convertê-lo para uma função compartilhada e criar um novo usuário com o mesmo nome:

regress=# ALTER ROLE test RENAME TO test_group;
NOTICE:  MD5 password cleared because of role rename
ALTER ROLE
regress=# ALTER ROLE test_group NOLOGIN;
ALTER ROLE
regress=# CREATE USER test IN GROUP test_group PASSWORD 'original user pw';
CREATE ROLE

Contanto que você defina a mesma senha, o usuário não notará a diferença.

Agora você pode criar um novo usuário e adicioná-lo à mesma função, fornecendo o mesmo acesso que o usuário test original tinha antes de transformá-lo na função test_group . Nesse caso, estou usando as etapas separadas de criação de um usuário e, em seguida, concedendo a ele uma associação de função; o efeito é o mesmo que o acima, estou mostrando duas maneiras diferentes de fazer isso:

regress=# CREATE USER newuser PASSWORD 'fred';
CREATE ROLE
regress=# GRANT test_group TO newuser;
GRANT ROLE

Agora, newuser can SELECT * FROM testtab , apesar de testtab pertencer ao usuário test e não ter GRANT s para permitir que outros usuários o acessem.

    
por 30.11.2012 / 10:46