Перейти к содержанию
#std485

Использование привилегированного режима

1.1.

Привилегированный режим позволяет:

  • выполнять операции с данными от имени пользователей, которым эти данные напрямую недоступны;
  • повышать производительность, так как при его использовании не применяются ограничения доступа к данным.
1.2.

Используйте привилегированный режим, когда:

  • проверку прав нужно логически отключить для конкретной операции;
  • проверку прав можно безопасно отключить для ускорения, не нарушая фактические права пользователя.
2.

Ниже приведены типовые сценарии использования привилегированного режима.

2.1.

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

  • оставляйте для них права только на чтение;
  • запись выполняйте в привилегированном режиме.

Так проверка прав на запись требуется только для регистратора.

Пример

Есть объекты:

  • Документ.ОприходованиеТоваров;
  • РегистрНакопления.ОстаткиНаСкладах;
  • Отчет.ОстаткиНаСкладах.

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

2.2.

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

Чтение/запись в такие регистры выполняйте только в привилегированном режиме.

Пример

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

2.3.

Если для разрешенной операции требуются заранее недоступные пользователю данные, получайте эти данные в привилегированном режиме, но соблюдайте два ограничения:

  • не передавайте такие данные на клиент;
  • используйте их на сервере только в рамках запланированной операции.

Пример

Есть объекты:

  • Документ.РеализацияТоваровИУслуг;
  • РегистрНакопления.Продажи;
  • РегистрНакопления.Взаиморасчеты.

Требования:

  • кладовщик проводит документ, который меняет регистр Продажи, но сам регистр кладовщику недоступен;
  • при проведении выполняется проверка по Взаиморасчеты, при этом доступ к регистру пользователю не открывается.
2.4.

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

Пример

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

Пример

Параметр сеанса ТекущийПользователь не доступен в ролях, поэтому он читается через привилегированный режим:

Функция ТекущийПользователь() Экспорт
    УстановитьПривилегированныйРежим(Истина);
    Возврат ПараметрыСеанса.ТекущийПользователь;
КонецФункции
3.

Неоправданное использование привилегированного режима создает риски безопасности.

3.1.

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

Особенно внимательно проверяйте экспортный API сервера (см. #std678).

Неправильно

Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    УстановитьПривилегированныйРежим(Истина); // Отключаем проверку прав
    // Изменяем данные
    ...
КонецПроцедуры

Правильно

Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    // Изменяем данные
    // Если прав недостаточно, платформа вызовет исключение
    ...
КонецПроцедуры

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

3.2.

Если к экспортной процедуре/функции обращается пользователь с недостаточными правами, должно возникать стандартное исключение (см. ВыполнитьПроверкуПравДоступа()).

Чаще всего дополнительный код не нужен: при корректно настроенных ролях и RLS исключение возникнет автоматически, например:

  • запрос без ключевого слова РАЗРЕШЕННЫЕ;
  • ПолучитьОбъект() по недоступной ссылке;
  • вызов недоступного метода глобального контекста.

Если нужна явная проверка, используйте ВыполнитьПроверкуПравДоступа().

Пример

Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
    ВыполнитьПроверкуПравДоступа(...);
    УстановитьПривилегированныйРежим(Истина);

    // Изменяем данные в привилегированном режиме
    ...
КонецПроцедуры
См. также
3.3.

Включайте привилегированный режим точечно:

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

Неправильно

Процедура ПодготовитьДанные()

    УстановитьПривилегированныйРежим(Истина);

    // Подготовка запроса, где нужна проверка прав
    // Выполнение запроса
    Выборка = Запрос.Выполнить().Выбрать();

    // Обработка результатов, где тоже нужна проверка прав
КонецПроцедуры

Правильно

Процедура ПодготовитьДанные()

    // Подготовка запроса

    УстановитьПривилегированныйРежим(Истина);
    Выборка = Запрос.Выполнить().Выбрать();
    УстановитьПривилегированныйРежим(Ложь);

    // Обработка результатов
КонецПроцедуры
4.

Для перехода в привилегированный режим используйте возможности платформы:

  1. В обработчиках документа ОбработкаПроведения и ОбработкаУдаленияПроведения:

    • через свойства документа Привилегированный режим при проведении и Привилегированный режим при отмене проведения;
    • если состав выборки должен ограничиваться правами пользователя, эти свойства не используйте, а включайте режим точечно через УстановитьПривилегированныйРежим().
  2. Свойство бизнес-процесса Привилегированный режим (для создания задач в привилегированном режиме).

  3. Свойство функциональной опции Привилегированный режим при получении.

  4. Процедуру глобального контекста УстановитьПривилегированныйРежим() в нужной точке кода:

    УстановитьПривилегированныйРежим(Истина);
    // Фрагмент кода в привилегированном режиме
    ...;
    УстановитьПривилегированныйРежим(Ложь);
    
  5. Общий модуль со свойством Привилегированный.

См. также
Источник

https://its.1c.ru/db/v8std#content:485