Neste tutorial, mostramos como usar visualizações parametrizadas no Spanner para restringir o acesso aos dados com base em parâmetros que um aplicativo transmite com segurança.
Para mais informações sobre visualizações parametrizadas, consulte Visão geral das visualizações parametrizadas.
Objetivos
- Criar uma tabela com dados de amostra.
- Crie uma visualização parametrizada que filtre dados com base em um parâmetro de contexto seguro.
- Crie um papel de banco de dados para o controle de acesso refinado que o aplicativo usa para se conectar ao banco de dados e acessar a visualização parametrizada.
- Conceda à nova função permissões para consultar a visualização parametrizada sem conceder acesso à tabela base.
- Consulte a visualização parametrizada de um aplicativo transmitindo um parâmetro no contexto seguro.
Antes de começar
Você precisa de uma instância e um banco de dados do Spanner para concluir este tutorial. Se você não tiver um, consulte Criar e consultar um banco de dados usando o console do Google Cloud para criar uma instância e um banco de dados do Spanner.
Preparar dados de amostra
No console Google Cloud , acesse a página Spanner.
Clique no nome da instância que você quer usar e selecione o banco de dados para este tutorial.
Na página Visão geral do banco de dados, no menu de navegação, clique em Spanner Studio.
Insira a seguinte instrução DDL para criar a tabela
checked_items:CREATE TABLE checked_items( bag_id INT64, item_timestamp TIMESTAMP, loc_code STRING(3), scan_type STRING(1), location STRING(MAX), customer_id INT64 ) PRIMARY KEY(bag_id);Clique em Executar.
Depois que o Spanner criar a tabela, insira a seguinte instrução para adicionar dados de amostra à tabela:
INSERT INTO checked_items (bag_id, item_timestamp, loc_code, scan_type, location, customer_id) VALUES (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123), (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456), (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789), (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101), (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202), (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);Clique em Executar.
Criar uma visualização parametrizada
Crie uma visualização com SQL SECURITY DEFINER que filtre as linhas de
checked_items com base no valor de app_end_userid fornecido por
SECURE_CONTEXT(). Essa função recupera valores de parâmetro que são
transmitidos com segurança pelo aplicativo.
No editor de consultas, digite a seguinte instrução para criar a visualização
secure_checked_items:CREATE VIEW secure_checked_items SQL SECURITY DEFINER AS (SELECT bag_id, item_timestamp, location FROM checked_items t WHERE customer_id = CAST(SECURE_CONTEXT('app_end_userid'), INT64));Clique em Executar.
Configurar privilégios de acesso
Para garantir que os usuários só possam acessar dados pela visualização
parametrizada, crie um papel de controle de acesso refinado e
conceda a ele a permissão SELECT na visualização. Verifique se nem o papel nem o papel do sistema public têm privilégios na tabela base subjacente.
No editor de consultas, insira a seguinte instrução para criar o papel
pv_user:CREATE ROLE pv_user;Conceda acesso à visualização:
GRANT SELECT ON VIEW secure_checked_items TO ROLE pv_user;Clique em Executar.
No entanto, se você precisar chamar SECURE_CONTEXT() diretamente para depurar suas
consultas, conceda a si mesmo o papel spanner_secure_context_reader. Não
conceda esse papel a agentes não confiáveis.
Consultar dados usando a visualização parametrizada
O aplicativo consulta uma visualização parametrizada definindo primeiro os parâmetros
no contexto seguro da solicitação de consulta e, em seguida, executando uma consulta
SELECT padrão na visualização. A visualização usa a função SECURE_CONTEXT()
para filtrar resultados com base em valores de parâmetro.
Os exemplos de código a seguir demonstram como definir o parâmetro seguro app_end_userid como 303 e consultar a visualização secure_checked_items:
C#
Go
Java
Python
Essa consulta retorna apenas linhas de checked_items em que customer_id é 303:
+--------+---------------------------+-------------+
| bag_id | item_timestamp | location |
+--------+---------------------------+-------------+
| 106 | 2023-10-26 12:00:00+00:00 | Truck Bay E |
+--------+---------------------------+-------------+
1 row.
Se o aplicativo se conectar ao Spanner usando um principal que
recebeu o papel pv_user, qualquer tentativa de consultar a tabela checked_items
diretamente vai resultar em um erro de permissão negada.
A seguir
- Saiba mais sobre a visão geral das visualizações parametrizadas.
- Saiba como criar e gerenciar visualizações.
- Saiba mais sobre o controle de acesso refinado.