En este instructivo, se muestra cómo usar vistas parametrizadas en Spanner para restringir el acceso a los datos según los parámetros que una aplicación pasa de forma segura.
Para obtener más información sobre las vistas parametrizadas, consulta Descripción general de las vistas parametrizadas.
Objetivos
- Crear una tabla con datos de muestra
- Crea una vista parametrizada que filtre los datos según un parámetro de contexto seguro.
- Crea un rol de base de datos para el control de acceso detallado que la aplicación usa para conectarse a la base de datos y acceder a la vista parametrizada.
- Otorga permisos al rol nuevo para consultar la vista parametrizada sin otorgarle acceso a la tabla base.
- Consulta la vista parametrizada desde una aplicación pasando un parámetro en el contexto seguro.
Antes de comenzar
Necesitas una instancia y una base de datos de Spanner para completar este instructivo. Si no tienes una, consulta Crea y consulta una base de datos con la consola de Google Cloud para crear una instancia y una base de datos de Spanner.
Prepara datos de muestra
En la consola de Google Cloud , ve a la página Spanner.
Haz clic en el nombre de la instancia que deseas usar y, luego, selecciona la base de datos que usarás en este instructivo.
En la página Descripción general de la base de datos, en el menú de navegación, haz clic en Spanner Studio.
Ingresa la siguiente declaración DDL para crear la tabla
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);Haz clic en Ejecutar.
Después de que Spanner cree la tabla, ingresa la siguiente sentencia para insertar datos de muestra en la tabla:
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);Haz clic en Ejecutar.
Crea una vista parametrizada
Crea una vista con SQL SECURITY DEFINER que filtre las filas de
checked_items según el valor de app_end_userid que proporciona
SECURE_CONTEXT(). Esta función recupera los valores de los parámetros que se
pasan de forma segura desde la aplicación.
En el editor de consultas, ingresa la siguiente sentencia para crear la vista
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));Haz clic en Ejecutar.
Configura los privilegios de acceso
Para asegurarte de que los usuarios solo puedan acceder a los datos a través de la vista
parametrizada, crea un rol de control de acceso detallado y
otórgale el permiso SELECT en la vista. Asegúrate de que ni el rol
ni el rol del sistema public
tengan privilegios en la tabla base subyacente.
En el editor de consultas, ingresa la siguiente sentencia para crear el rol
pv_user:CREATE ROLE pv_user;Otorga acceso a la vista:
GRANT SELECT ON VIEW secure_checked_items TO ROLE pv_user;Haz clic en Ejecutar.
Sin embargo, si necesitas llamar a SECURE_CONTEXT() directamente para depurar tus
consultas, otórgate el rol spanner_secure_context_reader. No
debes otorgar este rol a agentes que no sean de confianza.
Consulta datos con la vista parametrizada
Tu aplicación consulta una vista parametrizada. Para ello, primero establece parámetros
en el contexto seguro de la solicitud de consulta y, luego, ejecuta una consulta
SELECT estándar en la vista. La vista usa la función SECURE_CONTEXT()
para filtrar los resultados según los valores de los parámetros.
En las siguientes muestras de código, se indica cómo establecer el parámetro seguro app_end_userid
en 303 y consultar la vista secure_checked_items:
C#
Go
Java
Python
Esta consulta solo devuelve filas de checked_items en las que customer_id es 303:
+--------+---------------------------+-------------+
| bag_id | item_timestamp | location |
+--------+---------------------------+-------------+
| 106 | 2023-10-26 12:00:00+00:00 | Truck Bay E |
+--------+---------------------------+-------------+
1 row.
Si tu aplicación se conecta a Spanner con una principal a la que
se le otorgó el rol pv_user, cualquier intento de consultar la tabla checked_items
directamente generará un error de permiso denegado.
¿Qué sigue?
- Obtén más información en Descripción general de las vistas parametrizadas.
- Obtén información para crear y administrar vistas.
- Obtén más información sobre el control de acceso detallado.