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.

Obrázek toho, jak tvůrce rozhraní Data API může nastavit kontext relace SQL pro povolení zabezpečení na úrovni řádků

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 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. Vložte do Revenues tabulky čtyři ukázkové řádky.

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

    V tomto příkladu accessible_role sloupec ukládá název role, který má přístup k řádku.

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

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

(Volitelné) Vytvoření uložené procedury

Tato část ukazuje jednoduchý vzor "hello world" pro použití hodnot kontextu relace přímo v T-SQL.

  1. Vytvořte uloženou proceduru roles , která čte kontextovou hodnotu relace a používá ji k filtrování výsledků.

    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
    

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 \
        --auth.provider Simulator
    

    Pokud je pro SQL Server povolený kontext relace, tvůrce rozhraní DATA API odesílá ověřené deklarace identity uživatelů do SQL voláním sp_set_session_context (například roles). Povolení kontextu relace také zakáže ukládání odpovědí do mezipaměti pro tento zdroj dat.

  2. Přidejte novou entitu pojmenovanou revenuedbo.Revenues pro tabulku.

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

    dab start
    
  4. Dotazujte se na koncový bod bez zadání efektivní role. Všimněte si, že se nevrací žádná data, protože aktuální role je ve výchozím nastavení Authenticated.

    curl http://localhost:5000/api/revenue
    
  5. Dotazování koncového bodu při nastavování efektivní role na Oscar. Všimněte si, že filtrované výsledky obsahují pouze Oscar řádky.

    curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenue
    
  6. Zopakujte použití role Hannah.

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

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 roles relace na statickou hodnotu Oscar.

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

    SELECT * FROM dbo.Revenues;  
    
  4. (Volitelné) Dotazování tabulky pomocí uložené procedury

    EXEC dbo.GetRevenuesForCurrentRole;