Как программно определить вид аутентификации пользователя в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки сложных систем на платформе 1С:Предприятие часто возникает задача идентификации способа, которым пользователь вошел в систему. Это может быть необходимо для усиления безопасности, ведения расширенного аудита или настройки специфического поведения интерфейса для пользователей, зашедших под доменной учетной записью или через OpenID. В этой статье мы подробно разберем, как программно получить эти данные, и выясним разницу между «разрешенными» и «фактическими» методами входа.

Разбор свойств объекта ПользовательИнформационнойБазы

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

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

Рассмотрим пример кода, который позволяет проверить эти настройки:


ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();

Если ТекущийПользовательИБ.АутентификацияОС Тогда
    Сообщить("Для пользователя разрешена аутентификация через ОС. Имя пользователя ОС: " + ТекущийПользовательИБ.ПользовательОС);
КонецЕсли;

Если ТекущийПользовательИБ.АутентификацияСтандартная Тогда
    Сообщить("Для пользователя разрешена стандартная аутентификация (логин/пароль).");
КонецЕсли;

Важное различие: Разрешенный способ vs Фактический вход

Критически важно понимать ситуацию, описанную в сообщении №20 форума: вышеуказанные свойства являются лишь разрешениями. Если у пользователя в карточке установлены галочки и на «Аутентификацию ОС», и на «Стандартную аутентификацию», проверка свойств объекта ПользовательИнформационнойБазы не даст ответа на вопрос, как именно он зашел в текущую сессию.

Если нам нужно узнать фактический метод входа «здесь и сейчас», использование только этих свойств может привести к ошибке в логике безопасности. Рассмотрим более надежные методы.

Определение фактической аутентификации через Журнал регистрации

Наиболее достоверным способом узнать способ входа является анализ Журнала регистрации. Платформа фиксирует событие аутентификации в момент начала сеанса. Мы можем программно прочитать это событие, отфильтровав его по номеру текущего сеанса.

Разберем по шагам, как это реализовать:

  1. Получим номер текущего сеанса с помощью функции НомерСеансаИнформационнойБазы().
  2. Сформируем фильтр для чтения журнала регистрации.
  3. Выполним выгрузку журнала в таблицу значений и проанализируем колонку данных.

Пример кода для реализации этой задачи:


Фильтр = Новый Структура;
Фильтр.Вставить("НомерСеанса", НомерСеансаИнформационнойБазы());
Фильтр.Вставить("Событие", "_Authentication"); // Системное событие аутентификации

ТаблицаСобытий = Новый ТаблицаЗначений;
СкопироватьЖурналРегистрации(ТаблицаСобытий, Фильтр, "Дата, Данные, Комментарий");

Если ТаблицаСобытий.Количество() > 0 Тогда
    // В колонке "Данные" обычно содержится строка с типом входа
    СпособВхода = ТаблицаСобытий[0].Данные; 
    Сообщить("Фактический способ аутентификации: " + СпособВхода);
КонецЕсли;

В колонке Данные для события _Authentication платформа фиксирует маркеры, такие как "Standard", "OS" или "OpenID". Этот метод требует наличия прав на чтение журнала регистрации, поэтому его лучше выполнять в привилегированном модуле.

Косвенные методы проверки

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

Безопасность и привилегированный режим

В ходе дискуссии на форуме возник важный вопрос: может ли «хитроумный пользователь» изменить себе вид аутентификации программно? Выясним причины, почему это затруднительно:

Во-первых, чтение и модификация объектов ПользовательИнформационнойБазы требует административных прав (роль «Администрирование»). Во-вторых, даже попытка использовать УстановитьПривилегированныйРежим(Истина) внутри внешней обработки не сработает, если обработка запущена в безопасном режиме (что является стандартом для большинства современных конфигураций). Платформа игнорирует переход в привилегированный режим в безопасной среде, предотвращая несанкционированный доступ к списку пользователей ИБ.

Современные возможности (платформа 8.3.20+)

Не забудем про развитие платформы. В последних версиях появились новые возможности, которые стоит учитывать при программном анализе:

Подведем итог: для простого определения доступных методов используйте свойства ПользовательИнформационнойБазы. Для получения 100% достоверной информации о способе входа в текущем сеансе — используйте чтение журнала регистрации с фильтром по номеру сеанса в привилегированном коде.

← На главную