Condividi tramite


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

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

Prerequisiti

Create tabella e dati SQL

Create 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. Create una tabella denominata Revenues con id, category, revenuee username colonne.

    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. Testare i dati con una SELECT * semplice query.

    SELECT * FROM dbo.Revenues
    
  5. Creare una funzione denominata RevenuesPredicate. Questa funzione filtra i risultati in base al contesto della 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. Create criteri di sicurezza denominati RevenuesSecurityPolicy usando la funzione.

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

Eseguire lo strumento

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

  1. Create una nuova configurazione durante l'impostazione --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 di filtro.

Test in SQL

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

  1. Connettersi di nuovo al server SQL usando il client o lo strumento preferito.

  2. Eseguire l'oggetto per impostare manualmente l'attestazione sp_set_session_context del name contesto della sessione sul valore Oscarstatico .

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

    SELECT * FROM dbo.Revenues;