Використання привілейованого режиму
1.1. Привілейований режим дає змогу
1.1. Привілейований режим дає змогу
- виконувати операції з даними від імені користувачів, яким дані недоступні;
- прискорити роботу, оскільки в привілейованому режимі не накладаються обмеження на доступ до даних.
1.2. Привілейований режим слід використовувати
- коли з логічного погляду потрібно вимкнути перевірку прав;
- коли допустимо вимкнути перевірку прав, щоб прискорити роботу, і водночас робота з даними від імені користувача логічно не порушує встановлених для нього прав доступу.
2. Далі наведемо деякі типові сценарії використання привілейованого режиму.
2.1. Якщо підпорядковані регістри (рухи документів) потрібні користувачеві для отримання звітів, то такі регістри слід залишати доступними лише для читання, а запис до таких регістрів слід виконувати переходом у привілейований режим. За такого підходу перевірка прав на запис виконується лише для реєстратора.
Наприклад, у конфігурації є об'єкти метаданих:
- Документ.ОприходованиеТоваров
- РегистрНакопления.ОстаткиНаСкладах
- Отчет.ОстаткиНаСкладах.
Документ ОприходованиеТоваров виконує рухи за регістром накопичення ОстаткиНаСкладах під час проведення в привілейованому режимі. Користувачеві не потрібно безпосередньо змінювати регістр, але потрібно формувати звіт ОстаткиНаСкладах, який читає дані регістру. Тому користувачеві достатньо надати лише право читання регістру.
2.2. Якщо регістри не потрібні користувачеві ані для отримання звітів, ані в командному інтерфейсі, то не слід надавати користувачеві права на їх читання. Читання або запис даних до таких регістрів виконується переходом у привілейований режим.
Наприклад, у конфігурації є регістр відомостей ВерсииПодсистем, дані якого не виводяться у звітах, а доступ до нього здійснюється лише через спеціальні функції загального модуля. У цьому разі не слід надавати користувачам будь-які права доступу до регістру.
2.3. Якщо для виконання дозволеної користувачеві операції потрібні заздалегідь недоступні дані, тоді їх слід отримувати переходом у привілейований режим, але з гарантією запобігання передаванню цих даних на клієнтську сторону та з гарантією їх використання на сервері лише для виконання запланованої операції.
Наприклад, якщо в конфігурації є об'єкти метаданих
- Документ.РеализацияТоваровИУслуг
- РегистрНакопления.Продажи
- РегистрНакопления.Взаиморасчеты
і необхідно, щоб
- проведення документа від імені комірника змінювало регістр продажів, але регістр продажів залишався недоступним комірнику.
- під час проведення документа від імені комірника перевірявся стан взаєморозрахунків, але регістр взаєморозрахунків залишався недоступним комірнику.
2.4. Привілейований режим також слід використовувати з метою підвищення продуктивності у тих випадках, коли це не призводить до виконання дій або отримання даних, не дозволених користувачеві.
Приклад 1. Виконується запит, значення параметрів відбору якого вже пройшли перевірку обмеження прав на рівні записів. Тоді сам запит допустимо виконати в привілейованому режимі для підвищення його продуктивності. Перехід у привілейований режим, наприклад, під час отримання даних для звіту, слід ретельно розраховувати, щоб запобігти отриманню даних, не дозволених користувачеві.
Приклад 2. Параметр сеансу "Поточний користувач" недоступний у жодній ролі. Для отримання значення використовується функція:
Функция ТекущийПользователь() Экспорт УстановитьПривилегированныйРежим(Истина); Возврат ПараметрыСеанса.ТекущийПользователь; КонецФункции
3. Водночас невиправдане використання привілейованого режиму може призвести до проблем безпеки даних користувачів.
3.1. Потенційно небезпечними є будь-які експортні процедури та функції, які виконують на сервері будь-які дії з попереднім безумовним установленням привілейованого режиму, оскільки це вимикає перевірку прав доступу поточного користувача. Особливої уваги потребують експортні процедури та функції клієнтського прикладного програмного інтерфейсу сервера 1С:Підприємства.
Наприклад, неправильно:
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт УстановитьПривилегированныйРежим(Истина); // Вимикаємо перевірку прав доступу // Змінюємо дані в привілейованому режимі ... КонецПроцедуры
Правильно:
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт // Змінюємо дані // (водночас якщо користувач не має достатньо прав для виконання операції над даними, буде викликано виняток) ... КонецПроцедуры
Винятком є випадки, коли дія, яку виконує процедура, має бути дозволена (або значення, що повертається функцією, має бути доступним) абсолютно всім категоріям користувачів.
3.2. У випадках, коли до експортної процедури або функції звертаються в сеансі з недостатнім рівнем прав доступу, має викликатися виняток стандартного вигляду (див. метод платформи ВыполнитьПроверкуПравДоступа).
Як правило, для цього не потрібно передбачати в коді будь-які перевірки, оскільки за наявності в конфігурації ролей та обмежень доступу до даних на рівні записів (RLS) під час спроби звернення до недоступних даних виникне виняток:
- під час виконання запиту без ключового слова РАЗРЕШЕННЫЕ;
- під час виклику методу ПолучитьОбъект «від» недоступного посилання на об'єкт;
- під час виклику недоступного методу глобального контексту;
- та в інших аналогічних випадках.
За потреби виконати перевірку прав доступу вручну слід використовувати метод ВыполнитьПроверкуПравДоступа.
Приклад попередньої перевірки перед виконанням дій у привілейованому режимі:
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт ВыполнитьПроверкуПравДоступа(...); // Якщо користувач не має достатньо прав, буде викликано виняток УстановитьПривилегированныйРежим(Истина); // Вимикаємо перевірку прав доступу // Змінюємо дані в привілейованому режимі ... КонецПроцедуры
Див. також: Перехоплення винятків у коді
4. Для переходу в привілейований режим слід використовувати такі можливості платформи 1С:Підприємство:
- Під час реалізації логіки проведення та скасування проведення документів в обробниках модуля документа ОбработкаПроведения і ОбработкаУдаленияПроведения:
-
за допомогою встановлення властивостей документа "Привілейований режим під час проведення" і "Привілейований режим під час скасування проведення" (ці властивості переводять виконання обробників у привілейований режим);
-
якщо логіка проведення працює з певною вибіркою даних, склад якої має обмежуватися для користувача, то слід знімати ці властивості та використовувати процедуру глобального контексту УстановитьПривилегированныйРежим;
-
- Установлювати властивість бізнес-процесу "Привилегированный режим" для створення завдань у привілейованому режимі.
- Установлювати властивість бізнес-процесу "Привилегированный режим при получении" для функціональних опцій.
- У довільному місці будь-якого модуля за допомогою процедури глобального контексту УстановитьПривилегированныйРежим:
УстановитьПривилегированныйРежим(Истина) // фрагмент коду в привілейованому режимі // … УстановитьПривилегированныйРежим(Ложь)
- За допомогою розміщення процедур і функцій у загальному модулі з установленою властивістю Привилегированный.