Condividi tramite


Implementare la sicurezza a livello di riga con il contesto di sessione in Generatore API dati

Usare la funzionalità del contesto di sessione di SQL per implementare la sicurezza a livello di riga in Generatore API dati.

Illustrazione del modo in cui Generatore API dati può impostare il contesto di sessione SQL per abilitare la sicurezza a livello di riga.

Prerequisiti

Creare una tabella e dati SQL

Creare una tabella con dati fittizi da usare in questo scenario di esempio.

  1. Connettersi al database SQL usando il client o lo strumento preferito.

  2. Creare una tabella denominata Revenues con le colonne id, category, revenue e 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. Inserire quattro righe di esempio nella Revenues tabella.

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

    In questo esempio, la colonna accessible_role archivia il nome del ruolo che può accedere alla riga.

  4. Testate i vostri dati con una semplice query SELECT *.

    SELECT * FROM dbo.Revenues
    
  5. Creare una funzione denominata RevenuesPredicate. Questa funzione filtra i risultati in base al contesto di sessione corrente.

    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. Creare un criterio di sicurezza denominato RevenuesSecurityPolicy usando la funzione .

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

(Facoltativo) Creare una stored procedure

Questa sezione illustra un semplice modello "hello world" per l'uso dei valori di contesto della sessione direttamente in T-SQL.

  1. Creare una stored procedure che legge il valore del contesto della sessione roles e lo utilizza per filtrare i risultati.

    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
    

Eseguire lo strumento

Eseguire lo strumento Data API Builder (DAB) per generare un file di configurazione e una singola entità.

  1. Creare una nuova configurazione impostando --set-session-context su true.

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

    Quando il contesto di sessione è abilitato per SQL Server, Generatore API dati invia attestazioni utente autenticate a SQL chiamando sp_set_session_context (ad esempio, roles). L'abilitazione del contesto della sessione disabilita anche la memorizzazione nella cache delle risposte per l'origine dati.

  2. Aggiungere una nuova entità denominata revenue per la dbo.Revenues tabella.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "Authenticated:read"
    
  3. Avviare lo strumento Generatore API dati.

    dab start
    
  4. Eseguire una query sull'endpoint senza specificare un ruolo effettivo. Osservare che non vengono restituiti dati perché il ruolo effettivo è impostato su Authenticated.

    curl http://localhost:5000/api/revenue
    
  5. Eseguire una query sull'endpoint impostando il ruolo effettivo su Oscar. Osservare che i risultati filtrati includono solo le Oscar righe.

    curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenue
    
  6. Ripeti utilizzando il ruolo Hannah.

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

Test in SQL

Testare direttamente il filtro e il predicato in SQL per assicurarsi che funzioni.

  1. Connettersi di nuovo a SQL Server usando il client o lo strumento preferito.

  2. Esegui il sp_set_session_context per impostare manualmente l'attestazione roles del contesto sessione al valore statico Oscar.

    EXEC sp_set_session_context 'roles', 'Oscar';
    
  3. Esegue una query tipica SELECT *. Osservare che i risultati vengono filtrati automaticamente usando il predicato.

    SELECT * FROM dbo.Revenues;  
    
  4. (Facoltativo) Eseguire una query sulla tabella utilizzando la stored procedure.

    EXEC dbo.GetRevenuesForCurrentRole;