При разработке самописных конфигураций на платформе 1С часто возникает задача делегирования полномочий по управлению пользователями. Стандартная безопасность 1С блокирует возможность изменения свойств объектов ПользователиИнформационнойБазы (ПИБ) для пользователей, не обладающих правами администратора. Рассмотрим, как безопасно реализовать механизм смены пароля, не предоставляя пользователю критически высоких прав.
Платформа 1С строго разграничивает права доступа к учетным данным. Попытка записи изменений в объект пользователя без соответствующих прав приведет к ошибке доступа. Единственным способом обойти данное ограничение программным путем является использование привилегированного режима. Привилегированный режим позволяет выполнять код серверной части конфигурации без проверки прав доступа текущего пользователя.
Чтобы предоставить пользователю возможность менять свой или чужой пароль, нам необходимо вынести логику изменения данных в специальный Общий модуль, работающий в привилегированном режиме. Разберем по шагам, как это организовать:
Общий модуль (например, «УправлениеПользователямиСервер»).Рассмотрим пример кода для такого модуля:
Процедура ФойдаланувчиниТахрирлаш(Фойд, Номи, Парол, Рол) Экспорт
// Включаем привилегированный режим принудительно
УстановитьПривилегированныйРежим(Истина);
Если НЕ Фойд.Имя = "" Тогда
// Изменение существующего пользователя
Фойд.Имя = Номи;
Фойд.ПолноеИмя = Номи;
Фойд.Пароль = Парол;
Фойд.Роли.Очистить();
Фойд.Роли.Добавить(Метаданные.Роли.Найти(Рол));
Фойд.АутентификацияСтандартная = Истина;
Фойд.Записать();
Иначе
// Создание нового пользователя
НовФойд = ПользователиИнформационнойБазы.СоздатьПользователя();
НовФойд.Имя = Номи;
НовФойд.Роли.Добавить(Метаданные.Роли.Найти(Рол));
НовФойд.Пароль = Парол;
НовФойд.ПоказыватьВСпискеВыбора = Ложь;
НовФойд.АутентификацияСтандартная = Истина;
НовФойд.Записать();
КонецЕсли;
КонецПроцедуры
В самой управляемой форме вы можете вызывать эту процедуру. Поскольку модуль привилегирован, выполнение функции на сервере пройдет успешно, даже если у текущего пользователя нет прав на администрирование информационной базы.
&НаСервере
Процедура ИзменитьПарольНаСервере()
// Получаем текущего пользователя или выбираем другого
Поль = ПользователиИнформационнойБазы.ТекущийПользователь();
ПаролниУзгартириш.ФойдаланувчиниТахрирлаш(Поль, "ИмяПользователя", "НовыйПароль", "ИмяРоли");
КонецПроцедуры
При проектировании данного функционала важно учитывать следующие моменты:
Метаданные.Роли.Найти(Рол) может вернуть пустую ссылку, если имя роли передано неверно. Всегда добавляйте проверки на наличие роли в метаданных перед её присвоением пользователю.Регистр сведений. Пользователи создают запись-заявку, а фоновое задание (выполняемое от имени технической учетной записи с админ-правами) отрабатывает эту заявку и очищает регистр. Это считается наиболее безопасным архитектурным паттерном для систем без БСП.Использование привилегированного режима — это мощный инструмент, который требует аккуратности. Всегда ограничивайте область действия привилегированного кода только теми операциями, которые действительно требуют повышенных прав, чтобы сохранить общую безопасность вашей конфигурации.