В процессе разработки часто возникает задача идентифицировать пользователя не по его учетной записи в 1С, а по данным его учетной записи в домене (Active Directory). Это особенно актуально, когда в информационной базе не заведены все сотрудники как пользователи, либо используется сквозная аутентификация. Рассмотрим подробно, как решить эту задачу в различных условиях: от толстого клиента до работы в современном веб-браузере.
Если в информационной базе настроена связь между пользователем 1С и пользователем операционной системы, самым простым способом будет обращение к объекту ПользователиИнформационнойБазы. Разберем ситуацию, когда нам нужно получить строку, идентифицирующую пользователя в ОС. Проанализируем следующий подход:
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ДоменныйЛогин = ТекущийПользовательИБ.ПользовательОС;
Сообщить(ДоменныйЛогин);
Важный нюанс: Этот метод работает корректно только в том случае, если в карточке пользователя 1С заполнено поле "Аутентификация операционной системы". Если же в базе используется общая учетная запись для всех или аутентификация 1С отключена вовсе, этот метод вернет пустую строку или не те данные, которые мы ожидаем. В таком случае нам придется использовать более глубокие инструменты интеграции.
Для Windows-клиентов (толстый или тонкий клиент) мы можем воспользоваться интерфейсами операционной системы. Посмотрим на пример кода, который позволяет получить полное имя пользователя и другие атрибуты из Active Directory, используя COM-соединение. Проанализируем ситуацию, когда у нас есть только имя пользователя ОС:
// Получаем объект пользователя через WinNT
ПользовательОС = "Domain\UserName"; // Можно получить через ИмяПользователя() или переменные окружения
ПользовательОбъект = ПолучитьCOMОбъект("WinNT://" + СтрЗаменить(ПользовательОС, "\", "/") + ",user");
// Получаем полное имя (FullName)
ПолноеИмя = ПользовательОбъект.FullName;
Сообщить("Полное имя пользователя: " + ПолноеИмя);
// Если нужно достучаться до расширенных свойств через LDAP
// Предположим, мы знаем путь к контейнеру (Distinguished Name)
LDAPПуть = "LDAP://CN=" + ПолноеИмя + ",OU=Users,DC=mycompany,DC=local";
ПользовательAD = ПолучитьCOMОбъект(LDAPПуть);
Телефон = ПользовательAD.telephoneNumber;
Рассмотрим недостатки этого метода. Основная проблема заключается в том, что ПолучитьCOMОбъект и работа с ActiveX (WScript.Shell) заблокированы в современных браузерах (Chrome, Firefox, Safari) из соображений безопасности. Если ваш пользователь работает через веб-клиент, этот код вызовет ошибку. Также этот метод привязан к платформе Windows и не будет работать на Linux-серверах.
Начиная с версии платформы 1С:Предприятие 8.3.15, разработчики добавили нативный объект СоединениеLDAP. Это революционное решение, так как оно работает на стороне сервера (в том числе под Linux) и не требует использования COM. Выясним, как настроить поиск данных о пользователе с его помощью. Разберем по шагам процесс подключения:
1. Инициализируем соединение с контроллером домена. Мы можем использовать техническую учетную запись для поиска данных о других пользователях.
Соединение = Новый СоединениеLDAP;
Соединение.Сервер = "dc01.mycompany.local";
Соединение.Порт = 389;
Соединение.УчетнаяЗапись = "service_user@mycompany.local";
Соединение.Пароль = "SecretPassword123";
Попытка
Соединение.УстановитьСоединение();
Исключение
Сообщить("Ошибка подключения к AD: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
2. Выполним поиск пользователя по его логину (атрибут sAMAccountName), чтобы вычитать его электронную почту или отдел.
Фильтр = "(&(objectClass=user)(sAMAccountName=ivanov_ii))";
БазаПоиска = "DC=mycompany,DC=local";
Результат = Соединение.Поиск(БазаПоиска, Фильтр, "Subtree");
Для Каждого Запись Из Результат Цикл
// Выводим атрибуты, например, почту и департамент
Почта = Запись.Атрибуты.Получить("mail").Значения[0].Значение;
Отдел = Запись.Атрибуты.Получить("department").Значения[0].Значение;
Сообщить("Сотрудник: " + иванов_ii + ", Почта: " + Почта + ", Отдел: " + Отдел);
КонецЦикла;
Этот подход является наиболее надежным и кроссплатформенным. Он позволяет получать любую информацию из домена, не заставляя пользователя совершать лишних действий.
Проанализируем ситуацию, когда пользователь заходит через браузер. Как мы выяснили, браузер не даст нам напрямую прочитать данные из ОС. Однако, если 1С опубликована на веб-сервере IIS (Internet Information Services), мы можем настроить "Windows Authentication" (сквозную аутентификацию).
В этом случае веб-сервер сам договаривается с браузером через протоколы Kerberos или NTLM. Когда запрос доходит до сервера 1С, платформа уже "знает", какой доменный пользователь его отправил. Чтобы это заработало даже при "отключенной" аутентификации в самой 1С, можно использовать следующие механизмы:
ПользователиИнформационнойБазы.REMOTE_USER, который пробрасывает IIS. Для этого иногда требуются расширения веб-сервера или специализированные HTTP-сервисы на стороне 1С.Если нам нужно быстро получить данные, а настраивать СоединениеLDAP нет возможности (например, из-за сложных политик безопасности), мы можем выполнить скрипт PowerShell на сервере 1С под правами системной службы. Посмотрим на пример запуска команды:
ЛогинДляПоиска = "ivanov_ii";
Команда = "powershell -Command ""Get-ADUser -Identity " + ЛогинДляПоиска + " -Properties EmailAddress | Select-Object -ExpandProperty EmailAddress""";
// Используем ЗапуститьПриложение для выполнения команды и получения результата из файла
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("txt");
ЗапуститьПриложение(Команда + " > " + ИмяФайлаРезультата, , Истина);
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаРезультата, КодировкаТекста.OEM);
РезультатПоиска = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
Этот метод является "костыльным", но рабочим в тех случаях, когда нужно получить специфические данные, которые трудно достать через стандартный LDAP-запрос, например, информацию о членстве во вложенных группах безопасности.
Подведем итог: Для современных решений на платформе 8.3 лучшим выбором будет использование объекта СоединениеLDAP на стороне сервера. Если же стоит задача просто идентифицировать пользователя в веб-клиенте без создания учетных записей 1С, необходимо настраивать сквозную аутентификацию на стороне веб-сервера (IIS/Apache) и использовать возможности интеграции ОС, которые предоставляет платформа "из коробки" при правильно настроенной публикации.