Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте функцию контекста сеанса SQL для реализации безопасности на уровне строк в построителе API данных.
Предпосылки
- Существующий СЕРВЕР SQL и база данных.
- CLI инструмента построения API данных. Установка интерфейса командной строки
Создание таблицы и данных SQL
Создайте таблицу с вымышленными данными для использования в этом примере.
Подключитесь к базе данных SQL с помощью предпочтительного клиента или средства.
Создайте таблицу с именем
Revenuesс колонкамиid,category,revenueи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Вставьте четыре примера строк в таблицу
Revenues.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GOВ этом примере
accessible_roleстолбец сохраняет имя роли, которое может получить доступ к строке.Протестируйте данные с помощью простого
SELECT *запроса.SELECT * FROM dbo.RevenuesСоздайте функцию с именем
RevenuesPredicate. Эта функция будет фильтровать результаты на основе текущего контекста сеанса.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));Создайте политику безопасности с именем
RevenuesSecurityPolicyс помощью функции.CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role) ON dbo.Revenues;
(Необязательно) Создание хранимой процедуры
В этом разделе показан простой шаблон "hello world" для использования значений контекста сеанса непосредственно в T-SQL.
Создайте хранимую процедуру, которая считывает значение контекста сеанса
rolesи использует ее для фильтрации результатов.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
Инструмент запуска
Запустите инструмент построения данных (DAB), чтобы создать файл конфигурации и одну сущность.
Создайте новую конфигурацию, установив для
--set-session-contextзначение true.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true \ --auth.provider SimulatorЕсли контекст сеанса включен для SQL Server, построитель API данных отправляет утверждения пользователей, прошедшие проверку подлинности, в SQL путем вызова
sp_set_session_context(например,roles). Включение контекста сеанса также отключает кэширование ответов для этого источника данных.Добавьте новую сущность с именем
revenueдляdbo.Revenuesтаблицы.dab add revenue \ --source "dbo.Revenues" \ --permissions "Authenticated:read"Запустите средство построителя API данных.
dab startЗапрос конечной точки без указания эффективной роли. Обратите внимание, что данные не возвращаются, так как действующая роль по умолчанию устанавливается на
Authenticated.curl http://localhost:5000/api/revenueВыполните запрос к конечной точке, установив эффективную роль на
Oscar. Обратите внимание, что отфильтрованные результаты включают толькоOscarстроки.curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenueПовторно используйте роль
Hannah.curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
Тестирование в SQL
Проверьте фильтр и предикат в SQL напрямую, чтобы убедиться, что он работает.
Снова подключитесь к СЕРВЕРУ SQL Server с помощью предпочтительного клиента или средства.
Запустите
sp_set_session_context, чтобы вручную задать требование контекста сеансаrolesстатическим значениемOscar.EXEC sp_set_session_context 'roles', 'Oscar';Выполните типичный
SELECT *запрос. Обратите внимание, что результаты автоматически фильтруются с помощью предиката.SELECT * FROM dbo.Revenues;(Необязательно) Запросите таблицу с помощью хранимой процедуры.
EXEC dbo.GetRevenuesForCurrentRole;