Freigeben über


Implementierung von Zeilenebensicherheit mit Sitzungskontext im Data-API-Builder

Verwenden Sie das Sitzungskontextfeature von SQL, um die Sicherheit auf Zeilenebene im Daten-API-Generator zu implementieren.

Voraussetzungen

Erstellen einer SQL-Tabelle und -Daten

Erstellen Sie eine Tabelle mit fiktiven Daten, die in diesem Beispielszenario verwendet werden sollen.

  1. Stellen Sie mithilfe Ihres bevorzugten Clients oder Tools eine Verbindung mit der SQL-Datenbank her.

  2. Erstellen Sie eine Tabelle mit dem Namen Revenues und den Spalten id, category, revenue und username.

    DROP TABLE IF EXISTS dbo.Revenues;
    
    CREATE TABLE dbo.Revenues(
        id int PRIMARY KEY,  
        category varchar(max) NOT NULL,  
        revenue int,  
        username varchar(max) NOT NULL  
    );
    GO
    
  3. Fügen Sie vier Beispielbuchzeilen in die Revenues Tabelle ein.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. Testen Sie Ihre Daten mit einer einfachen SELECT * Abfrage.

    SELECT * FROM dbo.Revenues
    
  5. Erstellen Sie eine Funktion mit dem Namen RevenuesPredicate. Diese Funktion filtert Ergebnisse basierend auf dem aktuellen Sitzungskontext.

    CREATE FUNCTION dbo.RevenuesPredicate(@username varchar(max))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS RETURN SELECT 1 AS fn_securitypredicate_result
    WHERE @username = CAST(SESSION_CONTEXT(N'name') AS varchar(max));
    
  6. Erstellen Sie eine Sicherheitsrichtlinie mit dem Namen RevenuesSecurityPolicy unter Verwendung der Funktion.

    CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy
    ADD FILTER PREDICATE dbo.RevenuesPredicate(username)
    ON dbo.Revenues;
    

Ausführen des Tools

Führen Sie das DaB-Tool (Data API Builder) aus, um eine Konfigurationsdatei und eine einzelne Entität zu generieren.

  1. Erstellen Sie eine neue Konfiguration und setzen Sie --set-session-context auf "true".

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. Fügen Sie eine neue Entität mit dem Namen revenue für die Tabelle dbo.Revenues hinzu.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. Starten Sie das Daten-API-Generator-Tool.

    dab start
    
  4. Navigieren Sie zum http://localhost:5000/api/revenue Endpunkt. Beachten Sie, dass keine Daten zurückgegeben werden. Dieses Verhalten tritt auf, da der Sitzungskontext nicht festgelegt ist und keine Datensätze mit dem Filter-Prädikat übereinstimmen.

Testen in SQL

Testen Sie den Filter und das Prädikat in SQL direkt, um sicherzustellen, dass er funktioniert.

  1. Stellen Sie erneut eine Verbindung mit dem SQL-Server her, indem Sie ihren bevorzugten Client oder Ihr bevorzugtes Tool verwenden.

  2. Führen Sie sp_set_session_context aus, um den Anspruch des Sitzungskontexts name manuell auf den statischen Wert Oscar festzulegen.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Führen Sie eine typische SELECT * Abfrage aus. Beachten Sie, dass die Ergebnisse automatisch mithilfe des Prädikats gefiltert werden.

    SELECT * FROM dbo.Revenues;