使用 SQL 的 工作階段內容 功能,在資料 API 產生器中實作資料列層級安全性。
先決條件
- 現有的 SQL 伺服器和資料庫。
- 數據 API 產生器 CLI。 安裝 CLI
建立 SQL 資料表和數據
建立含有虛構數據的數據表,以在此範例案例中使用。
使用您慣用的用戶端或工具連線到 SQL 資料庫。
使用名稱為
Revenues的資料表,建立具有id、category、revenue和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將四個範例書籍數據列插入
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 SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(username) ON dbo.Revenues;
執行工具
執行數據 API 產生器 (DAB) 工具來產生組態檔和單一實體。
將
--set-session-context設定為 true 時,建立新的組態。dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true為數據表新增名為
revenuedbo.Revenues的新實體。dab add revenue \ --source "dbo.Revenues" \ --permissions "anonymous:read"啟動資料 API 產生器工具。
dab start流覽至
http://localhost:5000/api/revenue端點。 注意沒有傳回任何數據。 之所以發生此行為,是因為會話內容未設定,而且沒有記錄符合篩選述詞。
在 SQL 中測試
直接在 SQL 中測試篩選和述詞,以確保其運作正常。
使用您慣用的用戶端或工具再次連線到 SQL Server。
執行
sp_set_session_context以手動地將會話內容的name宣稱設置為Oscar靜態值。EXEC sp_set_session_context 'name', 'Oscar';執行一般
SELECT *查詢。 觀察結果是使用述詞自動篩選。SELECT * FROM dbo.Revenues;