Безопасность на уровне строк не работает должным образом - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть требование ограничить доступ к строкам, принадлежащим RegionID 1. Не знаете, как создать функцию предиката, чтобы удовлетворить это условие в функции предиката? Я даже пробовал жестко кодировать 0 и 1 в качестве операторов возврата, но он все равно возвращает все, никакой фильтрации.

Что я могу делать не так?

Тот, что ниже, даже не скомпилируется. Я также попробовал оператор Case, он компилируется, но возвращает все без фильтрации.

CREATE FUNCTION RLS.fn_RegionLimit(@RegionID int)
RETURNS table
with schemabinding
AS
   IF @RegionID=1
      RETURN 1
   ELSE
      RETURN 2

create security policy rls.PatientsSecurityPolicy
ADD Filter PREDICATE RLS.fn_RegionLimit(RegionID) on dbo.TestOrder
WITH (STATE=ON)

Select * from dbo.TestOrder

1 Ответ

0 голосов
/ 04 ноября 2018

Это только для определенных пользователей? Вы не хотите применять его только к определенным пользователям или ролям? Это звучит немного опасно.

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

Я разработал пример, основанный на этой функции безопасности:

CREATE FUNCTION dbo.fn_securitypredicate( @regionId INT )
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN

    SELECT 1 AS fn_securitypredicate_result
    WHERE @regionId = 1
       OR IS_SRVROLEMEMBER( N'sysadmin' ) = 1;

GO

Это распространяется на ВСЕХ, кроме системных администраторов, которых я добавил в качестве условия безопасности. Я выложил полный сценарий в виде сущности, которую вы можете просмотреть здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...