Несколько предикатов безопасности (FILTER|BLOCK) в одной таблице

Я реализую безопасность RBAC-RLS в своей базе данных, и у меня есть вопрос. Вот сценарий:

У меня есть функция с одним входным параметром @PermissionId, который проверяет, есть ли у зарегистрированного пользователя такая привилегия. Каждая роль в базе данных связана с несколькими разрешениями, и у каждого пользователя может быть несколько ролей.

Допустим, у меня есть таблица Products, и я хочу, чтобы только пользователи с разрешением ReadProducts могли просматривать содержимое таблицы.

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products

И это нормально, но теперь у меня тоже есть Разрешение SystemAdministrator и ему тоже нужно иметь права на просмотр содержимого таблицы Products.

Если я добавлю другую политику

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('SystemAdministrator') ON Products

Будет ли это работать так, как предполагается, или будет конфликт между двумя политиками?

Или другая ситуация, что, если я добавлю еще один предикат фильтра в первую политику. Так что это будет так:

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products
ADD FILTER PREDICATE HasPermission('SystemAdmin') ON Products

Будет ли это хорошо? Я имею в виду, если у меня как у пользователя есть одна из этих двух привилегий, смогу ли я увидеть содержимое таблицы Products?


person Stefan Taseski    schedule 20.09.2017    source источник


Ответы (1)


Я понял. Итак, вот оно:

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

Кроме того, вы не можете иметь 2 предиката FILTER для одной и той же таблицы в одной и той же политике безопасности. - Вы получите ошибку

Решение: Создайте политику безопасности для каждой таблицы в базе данных с 1 фильтром и 3-4 блокирующими предикатами, например:

CREATE SECURITY POLICY [Log]
ADD FILTER PREDICATE [dbo].[HasSecurityPermission]('ReadLog') ON [dbo].[table],
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('AddLog') ON [dbo].[table] AFTER INSERT,
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('EditLog') ON [dbo].[table] BEFORE UPDATE,
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('RemoveLog') ON [dbo].[table] BEFORE DELETE

Таким образом, вам нужно 4 разрешения для каждой таблицы базы данных, и в конце вы создаете столько ролей, сколько они являются типами пользователей (общедоступный пользователь, демоверсия, системный администратор, суперпользователь...) и связываете их с разрешениями, которые вы хотите, чтобы они имели.

Вот и все!

person Stefan Taseski    schedule 21.09.2017