Проверка прав доступа

#std737

Область применения: управляемое приложение, обычное приложение.

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

Эти меры позволяют:

2. Не рекомендуется использовать ролевую настройку видимости в  командном интерфейсе конфигурации, командном интерфейсе основного раздела, а также рабочей области начальной страницы. Вместо этого следует использовать настройку прав на разделы командного интерфейса, общие формы и объекты, включенные в командный интерфейс или в рабочую область. Это позволяет повысить предсказуемость поведения управляемого интерфейса для пользователя, а также упростить расследование ошибок.

3. Для проверки прав доступа в коде следует использовать метод ПравоДоступа.
Например, неправильно:

Если РольДоступна("ДобавлениеИзменениеСтранМира") Тогда ...
Если РольДоступна("ПросмотрОтчетаПопулярныеСтраны") Тогда ...

правильно:

Если ПравоДоступа("Редактирование", Метаданные.Справочники.СтраныМира) Тогда ...
Если ПравоДоступа("Просмотр", Метаданные.Отчеты.ПопулярныеСтраны) Тогда ...

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

4.1. В тех случаях, где роль не дает никаких прав на объекты метаданных, а служит только для определения того или иного дополнительного права, следует использовать метод РольДоступна. При использовании в конфигурации Библиотеки стандартных подсистем (БСП) следует использовать функцию РолиДоступны общего модуля Пользователи:
Например, без использования БСП:

Если РольДоступна(...) Или <ЭтоПолноправныйПользователь> Или ПривилегированныйРежим() Тогда ...

Либо аналогичная проверка с использованием БСП:

Если Пользователи.РолиДоступны(...) Тогда ...

4.2. Следует проектировать роли с учетом их влияния на командный интерфейс. В тех случаях, когда чтение или запись данных ведется в привилегированном режиме, не следует указывать в роли права с условием ограничения на уровне записей (RLS) ГДЕ ЛОЖЬ. Вместо этого следует проверять наличие роли.

Например, права на общую форму Заметка дают роли ДобавлениеИзменениеЗаметок и ЧтениеЗаметок. Обращение к данным заметок при этом выполняется в привилегированном режиме. В этом случае с помощью метода ПравоДоступа невозможно определить, можно ли пользователю добавлять заметки по наличию права на форму Заметка.

Неправильно:

Добавить в роль ДобавлениеИзменениеЗаметок фиктивные права на регистр сведений Заметки (с условием ограничения ГДЕ ЛОЖЬ) и выполнять проверку:
Если ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.Заметки) Тогда

Правильно:

Если РольДоступна("ДобавлениеИзменениеЗаметок") Или <ЭтоПолноправныйПользователь> Или ПривилегированныйРежим() Тогда

Либо аналогичная проверка с использованием БСП:

// АПК:515-выкл - №737.4.2 – Допустимо проверять роль, так как в ней нет прав,
// позволяющих определить может ли пользователь добавлять заметки.
Если Пользователи.РолиДоступны("ДобавлениеИзменениеЗаметок") Тогда
// АПК:515-вкл

См. также