Поделиться через


Реализация безопасности на уровне строк с контекстом сеанса в построителе API данных

Используйте функцию контекста сеанса SQL для реализации безопасности на уровне строк в построителе API данных.

Предварительные требования

Create таблицы и данных SQL

Create таблицу с вымышленными данными для использования в этом примере сценария.

  1. Подключитесь к базе данных SQL с помощью предпочтительного клиента или средства.

  2. 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
    
  3. Вставьте в таблицу 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. Create политику безопасности с именем RevenuesSecurityPolicy с помощью функции .

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

Запуск средства

Запустите построитель API данных (DAB), чтобы создать файл конфигурации и одну сущность.

  1. Create новую конфигурацию, задав значение --set-session-context true.

    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 Server с помощью предпочитаемого клиента или средства.

  2. Запустите , sp_set_session_context чтобы вручную задать для утверждения контекста сеанса name статическое значение Oscar.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Выполните типичный SELECT * запрос. Обратите внимание, что результаты автоматически фильтруются с помощью предиката.

    SELECT * FROM dbo.Revenues;