В процессе разработки сложных систем на платформе 1С:Предприятие часто возникает задача идентификации способа, которым пользователь вошел в систему. Это может быть необходимо для усиления безопасности, ведения расширенного аудита или настройки специфического поведения интерфейса для пользователей, зашедших под доменной учетной записью или через OpenID. В этой статье мы подробно разберем, как программно получить эти данные, и выясним разницу между «разрешенными» и «фактическими» методами входа.
Начнем с самого очевидного пути, который предлагает платформа. Для работы со сведениями о пользователях используется объект ПользовательИнформационнойБазы. Получить текущего пользователя можно через менеджер ПользователиИнформационнойБазы.ТекущийПользователь(). У данного объекта есть ряд свойств, отвечающих за аутентификацию.
Проанализируем основные свойства, которые упоминались в обсуждении:
Рассмотрим пример кода, который позволяет проверить эти настройки:
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТекущийПользовательИБ.АутентификацияОС Тогда
Сообщить("Для пользователя разрешена аутентификация через ОС. Имя пользователя ОС: " + ТекущийПользовательИБ.ПользовательОС);
КонецЕсли;
Если ТекущийПользовательИБ.АутентификацияСтандартная Тогда
Сообщить("Для пользователя разрешена стандартная аутентификация (логин/пароль).");
КонецЕсли;
Критически важно понимать ситуацию, описанную в сообщении №20 форума: вышеуказанные свойства являются лишь разрешениями. Если у пользователя в карточке установлены галочки и на «Аутентификацию ОС», и на «Стандартную аутентификацию», проверка свойств объекта ПользовательИнформационнойБазы не даст ответа на вопрос, как именно он зашел в текущую сессию.
Если нам нужно узнать фактический метод входа «здесь и сейчас», использование только этих свойств может привести к ошибке в логике безопасности. Рассмотрим более надежные методы.
Наиболее достоверным способом узнать способ входа является анализ Журнала регистрации. Платформа фиксирует событие аутентификации в момент начала сеанса. Мы можем программно прочитать это событие, отфильтровав его по номеру текущего сеанса.
Разберем по шагам, как это реализовать:
НомерСеансаИнформационнойБазы().Пример кода для реализации этой задачи:
Фильтр = Новый Структура;
Фильтр.Вставить("НомерСеанса", НомерСеансаИнформационнойБазы());
Фильтр.Вставить("Событие", "_Authentication"); // Системное событие аутентификации
ТаблицаСобытий = Новый ТаблицаЗначений;
СкопироватьЖурналРегистрации(ТаблицаСобытий, Фильтр, "Дата, Данные, Комментарий");
Если ТаблицаСобытий.Количество() > 0 Тогда
// В колонке "Данные" обычно содержится строка с типом входа
СпособВхода = ТаблицаСобытий[0].Данные;
Сообщить("Фактический способ аутентификации: " + СпособВхода);
КонецЕсли;
В колонке Данные для события _Authentication платформа фиксирует маркеры, такие как "Standard", "OS" или "OpenID". Этот метод требует наличия прав на чтение журнала регистрации, поэтому его лучше выполнять в привилегированном модуле.
Если доступ к журналу регистрации ограничен или требуется быстрая проверка без обращения к тяжелым объектам, проанализируем ситуацию через системные функции:
АутентификацияОС не использовалась. Однако наличие строки (например, "DOMAIN\Ivanov") не означает 100%, что вход был выполнен через домен. Пользователь мог авторизоваться через логин/пароль 1С, просто работая в доменной сессии Windows.OpenID или специфических внешних провайдеров, параметры строки соединения могут содержать дополнительные признаки (например, параметры публикации на веб-сервере).В ходе дискуссии на форуме возник важный вопрос: может ли «хитроумный пользователь» изменить себе вид аутентификации программно? Выясним причины, почему это затруднительно:
Во-первых, чтение и модификация объектов ПользовательИнформационнойБазы требует административных прав (роль «Администрирование»). Во-вторых, даже попытка использовать УстановитьПривилегированныйРежим(Истина) внутри внешней обработки не сработает, если обработка запущена в безопасном режиме (что является стандартом для большинства современных конфигураций). Платформа игнорирует переход в привилегированный режим в безопасной среде, предотвращая несанкционированный доступ к списку пользователей ИБ.
Не забудем про развитие платформы. В последних версиях появились новые возможности, которые стоит учитывать при программном анализе:
ПолучитьСеансыИнформационнойБазы(), где в свойствах сеанса фиксируется статус аутентификации.Подведем итог: для простого определения доступных методов используйте свойства ПользовательИнформационнойБазы. Для получения 100% достоверной информации о способе входа в текущем сеансе — используйте чтение журнала регистрации с фильтром по номеру сеанса в привилегированном коде.