Реализация безопасности на уровне строк с контекстом сеанса в построителе API данных
Используйте функцию контекста сеанса SQL для реализации безопасности на уровне строк в построителе API данных.
Предварительные требования
- Существующий сервер SQL и база данных.
- Интерфейс командной строки построителя API данных. Установка интерфейса командной строки
- Клиент базы данных (SQL Server Management Studio, Azure Data Studio и т. д.)
- Если у вас не установлен клиент, установите Azure Data Studio.
Create таблицы и данных SQL
Create таблицу с вымышленными данными для использования в этом примере сценария.
Подключитесь к базе данных SQL с помощью предпочтительного клиента или средства.
Create таблицу
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));
Create политику безопасности с именем
RevenuesSecurityPolicy
с помощью функции .CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(username) ON dbo.Revenues;
Запуск средства
Запустите построитель API данных (DAB), чтобы создать файл конфигурации и одну сущность.
Create новую конфигурацию, задав значение
--set-session-context
true.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 Server с помощью предпочитаемого клиента или средства.
Запустите ,
sp_set_session_context
чтобы вручную задать для утверждения контекста сеансаname
статическое значениеOscar
.EXEC sp_set_session_context 'name', 'Oscar';
Выполните типичный
SELECT *
запрос. Обратите внимание, что результаты автоматически фильтруются с помощью предиката.SELECT * FROM dbo.Revenues;