Поиск…


Предикат фильтра RLS

База данных Sql Server 2016+ и Azure Sql позволяет автоматически фильтровать строки, которые возвращаются в инструкции select с использованием некоторого предиката. Эта функция называется безопасностью уровня Row .

Во-первых, вам нужна табличная функция, содержащая некоторый предикат, который описывает, что это условие, которое позволит пользователям читать данные из какой-либо таблицы:

DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION

dbo.pUserCanAccessCompany(@CompanyID int)

    RETURNS TABLE
    WITH SCHEMABINDING
AS RETURN (
    SELECT 1 as canAccess WHERE 

    CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID

)

В этом примере предикат говорит, что доступ к компании могут получить только пользователи, имеющие значение в SESSION_CONTEXT, соответствующее совпадающему входному аргументу. Вы можете поместить любое другое условие, например, проверять роль базы данных или базу данных текущего пользователя и т. Д.

Большая часть приведенного выше кода - это шаблон, который вы скопируете. Единственное, что здесь изменится, это имя и аргументы предиката и условия в предложении WHERE. Теперь вы создаете политику безопасности, которая будет применять этот предикат в некоторой таблице.

Теперь вы можете создать политику безопасности, которая будет применять предикат в некоторой таблице:

CREATE SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
    WITH (State=ON)

Эта политика безопасности присваивает предикат таблице компании. Всякий раз, когда кто-то пытается прочитать данные из таблицы компании, политика безопасности будет применять предикат для каждой строки, передать столбец CompanyID в качестве параметра предиката, а предикат будет оценивать, должна ли эта строка быть возвращена в результате запроса SELECT.

Изменение политики безопасности RLS

Политика безопасности - это группа предикатов, связанных с таблицами, которые могут управляться вместе. Вы можете добавлять или удалять предикаты или включать / выключать всю политику.

Вы можете добавить больше предикатов в таблицы в существующую политику безопасности.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company

Вы можете удалить некоторые предикаты из политики безопасности:

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    DROP FILTER PREDICATE ON dbo.Company

Вы можете отключить политику безопасности

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );  

Вы можете включить политику безопасности, которая была отключена:

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );  

Предотвращение обновления с использованием предиката блока RLS

Безопасность на уровне строк позволяет определить некоторые предикаты, которые будут контролировать, кто может обновлять строки в таблице. Сначала вам нужно определить некоторую функцию table-value, которая представляет предикат, который будет контролировать политику доступа wll.

СОЗДАТЬ ФУНКЦИЮ

dbo.pUserCanAccessProduct (@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

AS RETURN (SELECT 1 as canAccess WHERE

CAST (SESSION_CONTEXT (N'CompanyID)) как int) = @CompanyID

) В этом примере предикат говорит, что доступ к компании могут получить только пользователи, имеющие значение в SESSION_CONTEXT, соответствующее совпадающему входному аргументу. Вы можете поместить любое другое условие, например, проверять роль базы данных или базу данных текущего пользователя и т. Д.

Большая часть приведенного выше кода - это шаблон, который вы скопируете. Единственное, что здесь изменится, это имя и аргументы предиката и условия в предложении WHERE. Теперь вы создаете политику безопасности, которая будет применять этот предикат в некоторой таблице.

Теперь мы можем создать политику безопасности с предикатом, который будет блокировать обновления в таблице продуктов, если столбец CompanyID в таблице не удовлетворяет предикату.

СОЗДАТЬ ПОЛИТИКУ БЕЗОПАСНОСТИ dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product

Этот предикат будет применяться ко всем операциям. Если вы хотите применить предикат к некоторой операции, вы можете написать что-то вроде:

СОЗДАТЬ ПОЛИТИКУ БЕЗОПАСНОСТИ dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product ПОСЛЕ ВСТАВКИ

Возможные параметры, которые вы можете добавить после определения предиката блока:

[{ПОСЛЕ {ВСТАВЬТЕ | ОБНОВИТЬ } }
| {ПЕРЕД ДОПОЛНЕНИЕМ | УДАЛЯТЬ } } ]



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow