次の方法で共有


データ API ビルダーでセッション コンテキストを使用して行レベルのセキュリティを実装する

SQL の セッション コンテキスト 機能を使用して、データ API ビルダーで行レベルのセキュリティを実装します。

前提条件

SQL テーブルとデータのCreate

この例のシナリオで使用する架空のデータを含むテーブルをCreateします。

  1. 任意のクライアントまたはツールを使用して SQL データベースに接続します。

  2. 、および 列を使用して という名前RevenuesのテーブルをrevenueidcategoryCreateします。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. 4 つのサンプルブック行をテーブルに Revenues 挿入します。

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. 単純な SELECT * クエリを使用してデータをテストします。

    SELECT * FROM dbo.Revenues
    
  5. RevenuesPredicate という名前の関数を作成します。 この関数は、現在のセッション コンテキストに基づいて結果をフィルター処理します。

    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. 関数を使用して という名前RevenuesSecurityPolicyのセキュリティ ポリシーをCreateします。

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

実行ツール

データ API ビルダー (DAB) ツールを実行して、構成ファイルと 1 つのエンティティを生成します。

  1. true に設定--set-session-contextしているときに、新しい構成をCreateします。

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. テーブルの という名前 revenue の新しいエンティティを dbo.Revenues 追加します。

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. データ API ビルダー ツールを起動します。

    dab start
    
  4. エンドポイントに http://localhost:5000/api/revenue 移動します。 データが返されていないことを確認します。 この動作は、セッション コンテキストが設定されておらず、フィルター述語に一致するレコードがないために発生します。

SQL でテストする

SQL でフィルターと述語を直接テストして、動作していることを確認します。

  1. 任意のクライアントまたはツールを使用して、SQL サーバーにもう一度接続します。

  2. sp_set_session_context 実行して、セッション コンテキストの name 要求を静的な値 Oscarに手動で設定します。

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. 一般的 SELECT * なクエリを実行します。 述語を使用して結果が自動的にフィルター処理されることを確認します。

    SELECT * FROM dbo.Revenues;