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.

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 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. Inserire quattro righe del libro 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
    
  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(@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. Creare un criterio di sicurezza denominato RevenuesSecurityPolicy usando la funzione .

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

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
    
  2. Aggiungere una nuova entità denominata revenue per la dbo.Revenues tabella.

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

    dab start
    
  4. Passare all'endpoint http://localhost:5000/api/revenue . Osservare che non vengono restituiti dati. Questo comportamento si verifica perché il contesto della sessione non è impostato e nessun record corrisponde al predicato del filtro.

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 name del contesto sessione al valore statico Oscar.

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

    SELECT * FROM dbo.Revenues;