Gerenciamento e controle de permissões de dados por meio de exibições
Use modos de exibição para conceder a usuários diferentes a permissão para consultar dados diferentes na mesma tabela, fornecendo gerenciamento e segurança de permissões de dados.
Cenário
Depois de se conectar ao cluster como usuário dbadmin, crie um cliente de tabela de exemplo.
1
|
CREATE TABLE customer (id bigserial NOT NULL, province_id bigint NOT NULL, user_info varchar, primary key (id)) DISTRIBUTE BY HASH(id); |
Insira os dados de teste no cliente da tabela de exemplo.
1 2 |
INSERT INTO customer(province_id,user_info) VALUES (1,'Alice'),(1,'Jack'),(2,'Jack'),(3,'Matu'); INSERT 0 4 |
Consulte a tabela do cliente.
1 2 3 4 5 6 7 8 |
SELECT * FROM customer; id | province_id | user_info ----+-------------+----------- 3 | 2 | Jack 1 | 1 | Alice 2 | 1 | Jack 4 | 3 | Matu (4 rows) |
Requisito: o usuário u1 pode visualizar apenas os dados da província 1 (province_id=1) e o usuário u2 pode visualizar apenas os dados da província 2 (province_id=2).
Implementação
Você pode criar uma exibição para atender aos requisitos no cenário anterior. O procedimento é o seguinte:
- Depois de se conectar ao cluster como usuário dbadmin, crie as exibições v1 e v2 para as províncias 1 e 2 no modo dbadmin.
Execute a instrução CREATE VIEW para criar a exibição v1 para consultar os dados da província 1.
1 2
CREATE VIEW v1 AS SELECT * FROM customer WHERE province_id=1;
Execute a instrução CREATE VIEW para criar a exibição v2 para consultar os dados da província 2.
1 2
CREATE VIEW v2 AS SELECT * FROM customer WHERE province_id=2;
- Crie os usuários u1 e u2.
1 2
CREATE USER u1 PASSWORD '*********'; CREATE USER u2 PASSWORD '*********';
- Execute a instrução GRANT para conceder a permissão de consulta de dados para o usuário de destino.
Conceda a permissão na exibição do esquema correspondente a u1 e u2.
1
GRANT USAGE ON schema dbadmin TO u1,u2;
Conceda a u1 a permissão para consultar os dados da província 1 na exibição v1.
1
GRANT SELECT ON v1 TO u1;
Conceda a u2 a permissão para consultar os dados da província 2 na exibição V2.
1
GRANT SELECT ON v2 TO u2;
Verificar o resultado da consulta
- Alterne para a conta u1 para se conectar ao cluster.
1
SET ROLE u1 PASSWORD '*********';
Essa interface é usada para consultar a exibição v1. u1 pode consultar apenas os dados da exibição v1.1 2 3 4 5 6
SELECT * FROM dbadmin.v1; id | province_id | user_info ----+-------------+----------- 1 | 1 | Alice 2 | 1 | Jack (2 rows)
Se u1 tentar consultar dados no modo de exibição v2, as seguintes informações de erro serão exibidas:1 2
SELECT * FROM dbadmin.v2; ERROR: SELECT permission denied to user "u1" for relation "dbadmin.v2"
O resultado mostra que o usuário u1 pode visualizar apenas os dados da província 1 (province_id=1).
- Use a conta u2 para se conectar ao cluster.
1
SET ROLE u2 PASSWORD '*********';
Essa interface é usada para consultar a exibição v2. u2 pode consultar apenas os dados da exibição v2.1 2 3 4 5
SELECT * FROM dbadmin.v2; id | province_id | user_info ----+-------------+----------- 3 | 2 | Jack (1 row)
Se u2 tentar consultar dados no modo de exibição v1, as seguintes informações de erro serão exibidas:
1 2
SELECT * FROM dbadmin.v1; ERROR: SELECT permission denied to user "u2" for relation "dbadmin.v1"
O resultado mostra que o usuário u2 pode visualizar apenas os dados da província 2 (province_id=2).