Sdílet prostřednictvím


Implementace zabezpečení na úrovni řádků s kontextem relace v Tvůrci rozhraní Data API

K implementaci zabezpečení na úrovni řádků v Tvůrci rozhraní Data API použijte funkci kontextu relace SQL.

Požadavky

Vytvoření tabulky a dat SQL

Vytvořte tabulku s fiktivními daty, která se mají použít v tomto ukázkovém scénáři.

  1. Připojte se k databázi SQL pomocí preferovaného klienta nebo nástroje.

  2. Vytvořte tabulku pojmenovanou Revenues se sloupci id, category, revenue a 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. Vložte do Revenues tabulky čtyři ukázkové řádky knihy.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. Otestujte data pomocí jednoduchého SELECT * dotazu.

    SELECT * FROM dbo.Revenues
    
  5. Vytvořte funkci s názvem RevenuesPredicate. Tato funkce bude filtrovat výsledky na základě aktuálního kontextu relace.

    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. Vytvořte zásadu zabezpečení pojmenovanou RevenuesSecurityPolicy pomocí funkce.

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

Spustit nástroj

Spuštěním nástroje Data API Builder (DAB) vygenerujte konfigurační soubor a jednu entitu.

  1. Vytvořte novou konfiguraci při nastavení --set-session-context na hodnotu true.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. Přidejte novou entitu pojmenovanou revenuedbo.Revenues pro tabulku.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. Spusťte nástroj Tvůrce rozhraní Data API.

    dab start
    
  4. Přejděte ke koncovému http://localhost:5000/api/revenue bodu. Všimněte si, že se nevrátí žádná data. K tomuto chování dochází, protože kontext relace není nastaven a žádné záznamy neodpovídají predikát filtru.

Testování v SQL

Otestujte filtr a predikát v SQL přímo, abyste měli jistotu, že funguje.

  1. Znovu se připojte k SQL Serveru pomocí preferovaného klienta nebo nástroje.

  2. Spusťte příkaz sp_set_session_context k ručnímu nastavení deklarace identity kontextu name relace na statickou hodnotu Oscar.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Spusťte typický SELECT * dotaz. Všimněte si, že výsledky se automaticky filtrují pomocí predikátu.

    SELECT * FROM dbo.Revenues;