In dieser Anleitung wird gezeigt, wie Sie parametrisierte Ansichten in Spanner verwenden, um den Zugriff auf Daten basierend auf Parametern einzuschränken, die eine Anwendung sicher übergibt.
Weitere Informationen zu parametrisierten Ansichten finden Sie unter Übersicht über parametrisierte Ansichten.
Ziele
- Tabelle mit Beispieldaten erstellen
- Erstellen Sie eine parametrisierte Ansicht, die Daten basierend auf einem sicheren Kontextparameter filtert.
- Erstellen Sie eine Datenbankrolle für die detaillierte Zugriffssteuerung, die die Anwendung verwendet, um eine Verbindung zur Datenbank herzustellen und auf die parametrisierte Ansicht zuzugreifen.
- Der neuen Rolle Berechtigungen zum Abfragen der parametrisierten Ansicht gewähren, ohne ihr Zugriff auf die Basistabelle zu gewähren
- Fragen Sie die parametrisierte Ansicht über eine Anwendung ab, indem Sie einen Parameter im sicheren Kontext übergeben.
Hinweis
Sie benötigen eine Cloud Spanner-Instanz und eine Datenbank, um diese Anleitung abzuschließen. Wenn Sie keine haben, finden Sie unter Datenbank mit der Google Cloud Console erstellen und abfragen Informationen zum Erstellen einer Instanz und einer Spanner-Datenbank.
Beispieldaten vorbereiten
Rufen Sie in der Google Cloud Console die Seite Spanner auf.
Klicken Sie auf den Namen der Instanz, die Sie verwenden möchten, und wählen Sie dann die Datenbank aus, die Sie für diese Anleitung verwenden möchten.
Klicken Sie auf der Seite Datenbankübersicht im Navigationsmenü auf Spanner Studio.
Geben Sie die folgende DDL-Anweisung ein, um die Tabelle
checked_itemszu erstellen: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);Klicken Sie auf Ausführen.
Nachdem Spanner die Tabelle erstellt hat, geben Sie die folgende Anweisung ein, um Beispieldaten in die Tabelle einzufügen:
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);Klicken Sie auf Ausführen.
Parametrisierte Ansicht erstellen
Erstellen Sie eine Ansicht mit SQL SECURITY DEFINER, die Zeilen aus checked_items anhand des von SECURE_CONTEXT() bereitgestellten Werts von app_end_userid filtert. Diese Funktion ruft Parameterwerte ab, die sicher von der Anwendung übergeben werden.
Geben Sie im Abfrageeditor die folgende Anweisung ein, um die Ansicht
secure_checked_itemszu erstellen: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));Klicken Sie auf Ausführen.
Zugriffsberechtigungen einrichten
Damit Nutzer nur über die parametrisierte Ansicht auf Daten zugreifen können, erstellen Sie eine Rolle für die detaillierte Zugriffssteuerung und weisen Sie dieser Rolle die Berechtigung SELECT für die Ansicht zu. Achten Sie darauf, dass weder die Rolle noch die Systemrolle public Berechtigungen für die zugrunde liegende Basistabelle haben.
Geben Sie im Abfrageeditor die folgende Anweisung ein, um die Rolle
pv_userzu erstellen:CREATE ROLE pv_user;Gewähren Sie Zugriff auf die Ansicht:
GRANT SELECT ON VIEW secure_checked_items TO ROLE pv_user;Klicken Sie auf Ausführen.
Wenn Sie jedoch SECURE_CONTEXT() direkt aufrufen müssen, um Ihre Abfragen zu debuggen, weisen Sie sich die Rolle spanner_secure_context_reader zu. Sie dürfen diese Rolle nicht an nicht vertrauenswürdige Agents vergeben.
Daten mit der parametrisierten Ansicht abfragen
Ihre Anwendung fragt eine parametrisierte Ansicht ab, indem sie zuerst Parameter im sicheren Kontext der Abfrageanfrage festlegt und dann eine Standard-SELECT-Abfrage für die Ansicht ausführt. In der Ansicht wird die Funktion SECURE_CONTEXT() verwendet, um Ergebnisse anhand von Parameterwerten zu filtern.
Die folgenden Codebeispiele zeigen, wie Sie den sicheren Parameter app_end_userid auf 303 setzen und die Ansicht secure_checked_items abfragen:
C#
Go
Java
Python
Diese Abfrage gibt nur Zeilen aus checked_items zurück, in denen customer_id den Wert 303 hat:
+--------+---------------------------+-------------+
| bag_id | item_timestamp | location |
+--------+---------------------------+-------------+
| 106 | 2023-10-26 12:00:00+00:00 | Truck Bay E |
+--------+---------------------------+-------------+
1 row.
Wenn Ihre Anwendung eine Verbindung zu Spanner über ein Hauptkonto herstellt, dem die Rolle pv_user zugewiesen wurde, führt jeder Versuch, die Tabelle checked_items direkt abzufragen, zu einem Fehler „Berechtigung verweigert“.