Delen via


Beveiliging op rijniveau implementeren met sessiecontext in Data API Builder

Gebruik de sessiecontextfunctie van SQL om beveiliging op rijniveau te implementeren in Data API Builder.

Afbeelding van hoe Data API Builder SQL-sessiecontext kan instellen om beveiliging op rijniveau in te schakelen.

Vereiste voorwaarden

SQL-tabel en -gegevens maken

Maak een tabel met fictieve gegevens die in dit voorbeeldscenario moeten worden gebruikt.

  1. Maak verbinding met de SQL-database met behulp van uw favoriete client of hulpprogramma.

  2. Maak een tabel genaamd Revenues met de kolommen id, category, revenue, en accessible_role.

    DROP TABLE IF EXISTS dbo.Revenues;
    
    CREATE TABLE dbo.Revenues(
        id int PRIMARY KEY,  
        category varchar(max) NOT NULL,  
        revenue int,  
        accessible_role varchar(max) NOT NULL  
    );
    GO
    
  3. Voeg vier voorbeeldrijen in de Revenues tabel in.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    

    In dit voorbeeld wordt in de accessible_role kolom de rolnaam opgeslagen die toegang heeft tot de rij.

  4. Test uw gegevens met een eenvoudige SELECT * query.

    SELECT * FROM dbo.Revenues
    
  5. Maak een functie met de naam RevenuesPredicate. Met deze functie worden resultaten gefilterd op basis van de huidige sessiecontext.

    CREATE FUNCTION dbo.RevenuesPredicate(@accessible_role varchar(max))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS RETURN SELECT 1 AS fn_securitypredicate_result
    WHERE @accessible_role = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));
    
  6. Maak een beveiligingsbeleid met de naam RevenuesSecurityPolicy met behulp van de functie.

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

(Optioneel) Een opgeslagen procedure maken

In deze sectie ziet u een eenvoudig 'hallo wereld'-patroon voor het gebruik van sessiecontextwaarden rechtstreeks in T-SQL.

  1. Maak een opgeslagen procedure die de waarde van de roles sessiecontext leest en deze gebruikt om resultaten te filteren.

    CREATE OR ALTER PROCEDURE dbo.GetRevenuesForCurrentRole
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @role varchar(max) = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));
    
        SELECT id, category, revenue, accessible_role
        FROM dbo.Revenues
        WHERE accessible_role = @role;
    END
    GO
    

Hulpprogramma uitvoeren

Voer het hulpprogramma Data API Builder (DAB) uit om een configuratiebestand en één entiteit te genereren.

  1. Maak een nieuwe configuratie en stel deze in op --set-session-context true.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true \
        --auth.provider Simulator
    

    Wanneer sessiecontext is ingeschakeld voor SQL Server, verzendt Data API Builder geverifieerde gebruikersclaims naar SQL door aan te roepen sp_set_session_context (bijvoorbeeld roles). Als u sessiecontext inschakelt, wordt ook de cache van reacties voor die gegevensbron uitgeschakeld.

  2. Voeg een nieuwe entiteit toe met de naam revenue van de dbo.Revenues tabel.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "Authenticated:read"
    
  3. Start het hulpprogramma voor het maken van data-API's.

    dab start
    
  4. Voer een query uit op het eindpunt zonder een effectieve rol op te geven. U ziet dat er geen gegevens worden geretourneerd omdat de effectieve rol standaard is ingesteld op Authenticated.

    curl http://localhost:5000/api/revenue
    
  5. Voer een query uit op het eindpunt tijdens het instellen van de effectieve rol op Oscar. U ziet dat de gefilterde resultaten alleen de Oscar rijen bevatten.

    curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenue
    
  6. Herhaal dit met behulp van de Hannah rol.

    curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
    

Testen in SQL

Test het filter en predicaat rechtstreeks in SQL om te controleren of het werkt.

  1. Maak opnieuw verbinding met de SQL-server met behulp van uw favoriete client of hulpprogramma.

  2. Voer de sp_set_session_context opdracht uit om de claim van roles uw sessiecontext handmatig in te stellen op de statische waarde Oscar.

    EXEC sp_set_session_context 'roles', 'Oscar';
    
  3. Voer een typische SELECT * query uit. U ziet dat de resultaten automatisch worden gefilterd met behulp van het predicaat.

    SELECT * FROM dbo.Revenues;  
    
  4. (Optioneel) Voer een query uit op de tabel met behulp van de opgeslagen procedure.

    EXEC dbo.GetRevenuesForCurrentRole;