Microsoft SQL Server
Безопасность на уровне строк
Поиск…
Предикат фильтра 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 ПОСЛЕ ВСТАВКИ
Возможные параметры, которые вы можете добавить после определения предиката блока:
[{ПОСЛЕ {ВСТАВЬТЕ | ОБНОВИТЬ } }
| {ПЕРЕД ДОПОЛНЕНИЕМ | УДАЛЯТЬ } } ]