Рекомендации по настройке
Рекомендуется выполнять настройку безопасности в определенной последовательности:
Настройка readonly-полей.
Readonly-поля не могут редактировать даже пользователи с ролью Администратор. Для этого в настройках полей объекта нужно проставить для них флаг Только чтение.
Только чтениеНастройка права доступа к объектам.
Определить в настройках объекта для роли/группы/пользователя доступные действия. Чтобы закрыть доступ к объекту, нужно запретить чтение.
Есть возможность определять доступ как для отдельных пользователей, так и для групп и ролей.
Однако рекомендуется предоставлять доступ только ролям, реализуя модель RBAC, а затем эти роли назначать пользователям и группам.
Также есть возможность задать фильтр для записей объекта, который ограничит видимость записей объекта. Но для настройки сложной логики предоставления прав он не подойдет — в таком случае нужно использовать функцию безопасности.
Настройка права доступа к полям.
Необходимо задать для роли/группы/пользователя ограничения на доступ к полям.
Написание SQL-функции безопасности.
Ей можно задать ограничения на уровне записей, а также ограничения, которые накладываются в зависимости от выполнения условий.
Функция безопасности позволяет настроить:
Ограничение видимости части записей по какому-то условию.
Ограничение прав к полям, в зависимости от каких-то атрибутов записи.
При написании функций безопасности необходимо:
Помнить, что функция безопасности используется для ограничений, а не для выдачи дополнительных прав доступа.
Избегать дублирования кода и выносить общие части в отдельные функции.
Написать код компактно.
Комментировать сложную бизнес-логику.
Если функция безопасности возвращает запись, значит она имеет, как минимум, права на чтение.
Использовать функцию
mdt.udf_PermissionMask
вместо неочевидных констант. Если функция не должна ограничивать права пользователя, она должна возвращать маскуmdt.udf_PermissionMask('ARWD')
.Если у пользователя 2 и более ролей, то роль, у которой больше прав, должна быть указана выше, чем роль, у которой прав меньше. Например,
mdt.udf_PermissionMask('RW')
должна возвращаться раньше, чемmdt.udf_PermissionMask('R')
.