Questo tutorial mostra come utilizzare le viste parametrizzate in Spanner per limitare l'accesso ai dati in base ai parametri passati in modo sicuro da un'applicazione.
Per saperne di più sulle viste parametrizzate, consulta la panoramica delle viste parametrizzate.
Obiettivi
- Crea una tabella con dati di esempio.
- Crea una vista con parametri che filtra i dati in base a un parametro di contesto sicuro.
- Crea un ruolo del database per il controllo granulare dell'accesso che l'applicazione utilizza per connettersi al database e accedere alla vista parametrizzata.
- Concedi al nuovo ruolo le autorizzazioni per eseguire query sulla vista parametrizzata senza concedergli l'accesso alla tabella di base.
- Esegui una query sulla vista parametrizzata da un'applicazione passando un parametro nel contesto sicuro.
Prima di iniziare
Per completare questo tutorial, devi disporre di un'istanza e di un database Spanner. Se non ne hai uno, consulta Crea ed esegui query su un database utilizzando la console Google Cloud per creare un'istanza e un database Spanner.
Prepara i dati di esempio
Nella console Google Cloud , vai alla pagina Spanner.
Fai clic sul nome dell'istanza che vuoi utilizzare, quindi seleziona il database da utilizzare per questo tutorial.
Nella pagina Panoramica del database, nel menu di navigazione, fai clic su Spanner Studio.
Inserisci la seguente istruzione DDL per creare la tabella
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);Fai clic su Esegui.
Dopo che Spanner ha creato la tabella, inserisci la seguente istruzione per inserire i dati di esempio nella tabella:
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);Fai clic su Esegui.
Crea una vista parametrizzata
Crea una vista con SQL SECURITY DEFINER che filtra le righe di checked_items in base al valore di app_end_userid fornito da SECURE_CONTEXT(). Questa funzione recupera i valori parametro che vengono trasmessi in modo sicuro dall'applicazione.
Nell'editor di query, inserisci la seguente istruzione per creare 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));Fai clic su Esegui.
Configura i privilegi di accesso
Per assicurarti che gli utenti possano accedere ai dati solo tramite la vista parametrizzata, crea un ruolo di controllo dell'accesso granulare e concedi a quel ruolo l'autorizzazione SELECT sulla vista. Assicurati che né il ruolo né il ruolo di sistema public dispongano di privilegi sulla tabella di base sottostante.
Nell'editor di query, inserisci la seguente istruzione per creare il ruolo
pv_user:CREATE ROLE pv_user;Concedi l'accesso alla visualizzazione:
GRANT SELECT ON VIEW secure_checked_items TO ROLE pv_user;Fai clic su Esegui.
Tuttavia, se devi chiamare direttamente SECURE_CONTEXT() per eseguire il debug delle query, concediti il ruolo spanner_secure_context_reader. Non devi concedere questo ruolo ad agenti non attendibili.
Esegui query sui dati utilizzando la vista con parametri
La tua applicazione esegue query su una vista parametrizzata impostando prima i parametri nel contesto sicuro della richiesta di query, quindi eseguendo una query SELECT standard sulla vista. La vista utilizza la funzione SECURE_CONTEXT() per filtrare i risultati in base ai valori dei parametri.
I seguenti esempi di codice mostrano come impostare il parametro sicuro app_end_userid su 303 ed eseguire query sulla vista secure_checked_items:
C#
Vai
Java
Python
Questa query restituisce solo le righe di checked_items in cui customer_id è 303:
+--------+---------------------------+-------------+
| bag_id | item_timestamp | location |
+--------+---------------------------+-------------+
| 106 | 2023-10-26 12:00:00+00:00 | Truck Bay E |
+--------+---------------------------+-------------+
1 row.
Se la tua applicazione si connette a Spanner utilizzando un'entità a cui è stato concesso il ruolo pv_user, qualsiasi tentativo di eseguire query direttamente sulla tabella checked_items genera un errore di autorizzazione negata.
Passaggi successivi
- Scopri di più sulla panoramica delle viste parametrizzate.
- Scopri come creare e gestire le visualizzazioni.
- Scopri di più sul controllo granulare dell'accesso.