Рекомендации по настройке

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

  1. Настройка readonly-полей.

    Readonly-поля не могут редактировать даже пользователи с ролью Администратор. Для этого в настройках полей объекта нужно проставить для них флаг Только чтение.

    Только чтение

  2. Настройка права доступа к объектам.

    Определить в настройках объекта для роли/группы/пользователя доступные действия. Чтобы закрыть доступ к объекту, нужно запретить чтение.

    Есть возможность определять доступ как для отдельных пользователей, так и для групп и ролей.

    Однако рекомендуется предоставлять доступ только ролям, реализуя модель RBAC, а затем эти роли назначать пользователям и группам.

    Также есть возможность задать фильтр для записей объекта, который ограничит видимость записей объекта. Но для настройки сложной логики предоставления прав он не подойдет — в таком случае нужно использовать функцию безопасности.

  3. Настройка права доступа к полям.

    Необходимо задать для роли/группы/пользователя ограничения на доступ к полям.

  4. Написание SQL-функции безопасности.

    Ей можно задать ограничения на уровне записей, а также ограничения, которые накладываются в зависимости от выполнения условий.

    Функция безопасности позволяет настроить:

    • Ограничение видимости части записей по какому-то условию.

    • Ограничение прав к полям, в зависимости от каких-то атрибутов записи.

    При написании функций безопасности необходимо:

    • Помнить, что функция безопасности используется для ограничений, а не для выдачи дополнительных прав доступа.

    • Избегать дублирования кода и выносить общие части в отдельные функции.

    • Написать код компактно.

    • Комментировать сложную бизнес-логику.

    • Если функция безопасности возвращает запись, значит она имеет, как минимум, права на чтение.

    • Использовать функцию mdt.udf_PermissionMask вместо неочевидных констант. Если функция не должна ограничивать права пользователя, она должна возвращать маску mdt.udf_PermissionMask('ARWD').

    • Если у пользователя 2 и более ролей, то роль, у которой больше прав, должна быть указана выше, чем роль, у которой прав меньше. Например, mdt.udf_PermissionMask('RW') должна возвращаться раньше, чем mdt.udf_PermissionMask('R').