データ API ビルダーでセッション コンテキストを使用して行レベルのセキュリティを実装する
SQL の セッション コンテキスト 機能を使用して、データ API ビルダーで行レベルのセキュリティを実装します。
前提条件
- 既存の SQL サーバーとデータベース。
- データ API ビルダー CLI。 CLI をインストールする
- データベース クライアント (SQL Server Management Studio、Azure Data Studio など)
- クライアントがインストールされていない場合は、Azure Data Studio をインストールします
SQL テーブルとデータのCreate
この例のシナリオで使用する架空のデータを含むテーブルをCreateします。
任意のクライアントまたはツールを使用して SQL データベースに接続します。
、および 列を使用して という名前
Revenues
のテーブルをrevenue
id
category
Createします。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
4 つのサンプルブック行をテーブルに
Revenues
挿入します。INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GO
単純な
SELECT *
クエリを使用してデータをテストします。SELECT * FROM dbo.Revenues
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));
関数を使用して という名前
RevenuesSecurityPolicy
のセキュリティ ポリシーをCreateします。CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(username) ON dbo.Revenues;
実行ツール
データ API ビルダー (DAB) ツールを実行して、構成ファイルと 1 つのエンティティを生成します。
true に設定
--set-session-context
しているときに、新しい構成をCreateします。dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true
テーブルの という名前
revenue
の新しいエンティティをdbo.Revenues
追加します。dab add revenue \ --source "dbo.Revenues" \ --permissions "anonymous:read"
データ API ビルダー ツールを起動します。
dab start
エンドポイントに
http://localhost:5000/api/revenue
移動します。 データが返されていないことを確認します。 この動作は、セッション コンテキストが設定されておらず、フィルター述語に一致するレコードがないために発生します。
SQL でテストする
SQL でフィルターと述語を直接テストして、動作していることを確認します。
任意のクライアントまたはツールを使用して、SQL サーバーにもう一度接続します。
を
sp_set_session_context
実行して、セッション コンテキストのname
要求を静的な値Oscar
に手動で設定します。EXEC sp_set_session_context 'name', 'Oscar';
一般的
SELECT *
なクエリを実行します。 述語を使用して結果が自動的にフィルター処理されることを確認します。SELECT * FROM dbo.Revenues;