Dela via


Implementera säkerhet på radnivå med sessionskontext i Data API Builder

Använd sessionskontextfunktionen i SQL för att implementera säkerhet på radnivå i Data API Builder.

Förutsättningar

  • Befintlig SQL-server och databas.
  • Cli för data-API-byggare. Installera CLI
  • En databasklient (SQL Server Management Studio, Azure Data Studio osv.)

Skapa SQL-tabell och data

Skapa en tabell med fiktiva data som ska användas i det här exempelscenariot.

  1. Anslut till SQL-databasen med den klient eller det verktyg du föredrar.

  2. Skapa en tabell med idnamnet Revenues , category, revenueoch username kolumner.

    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. Infoga fyra exempelboksrader i Revenues tabellen.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. Testa dina data med en enkel SELECT * fråga.

    SELECT * FROM dbo.Revenues
    
  5. Skapa en funktion med namnet RevenuesPredicate. Den här funktionen filtrerar resultat baserat på den aktuella sessionskontexten.

    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. Skapa en säkerhetsprincip med namnet RevenuesSecurityPolicy med hjälp av funktionen .

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

Kör verktyg

Kör verktyget Data API Builder (DAB) för att generera en konfigurationsfil och en enda entitet.

  1. Skapa en ny konfiguration när inställningen --set-session-context är true.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. Lägg till en ny entitet med namnet revenue för dbo.Revenues tabellen.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. Starta verktyget Data API Builder.

    dab start
    
  4. Gå till http://localhost:5000/api/revenue slutpunkten. Observera att inga data returneras. Det här beteendet beror på att sessionskontexten inte har angetts och inga poster matchar filterpredikatet.

Testa i SQL

Testa filtret och predikatet i SQL direkt för att säkerställa att det fungerar.

  1. Anslut till SQL-servern igen med den klient eller det verktyg du föredrar.

  2. sp_set_session_context Kör för att manuellt ange sessionskontextens name anspråk till det statiska värdet Oscar.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Kör en typisk SELECT * fråga. Observera att resultaten filtreras automatiskt med hjälp av predikatet.

    SELECT * FROM dbo.Revenues;