Настройка авторизации

Эта страница описывает проверку логина и пароля при входе в ERP: встроенную проверку учётной записи и вход через LDAP. Доступ к разделам и действиям после входа определяется отдельно — группами и наборами прав в справочнике сотрудников.

Настройки задаются в основной конфигурации. Учитывайте переопределения из файла свойств сервера: они имеют приоритет над активной конфигурацией из БД.

Выбор способов входа

Параметр auth.types содержит список аутентификаторов через запятую. Они проверяются по порядку до первого успешного результата. Если проверка не удалась, ERP переходит к следующему способу; если не подошёл ни один, форма входа показывает ошибки проверки.

Значение Назначение

base

Проверка логина и пароля сотрудника в ERP. Значение по умолчанию.

ldap_manager

Вход через LDAP с поиском сотрудника по идентификатору employeeID и созданием учётной записи ERP при первом входе.

ldap

Старый LDAP-аутентификатор со схемой доменов, привязанной к Уфанет. Автоматически сотрудников не создаёт.

Для встроенного входа достаточно:

auth.types=base

Пример последовательной проверки через LDAP и затем через ERP:

auth.types=ldap_manager,base

Наличие base в списке разрешает отдельный вход с паролем ERP, даже если LDAP отклонил пароль. Порядок списка не делает LDAP обязательным. Если требуется проверять только доменные учётные данные, используется auth.types=ldap_manager.

Неизвестные имена аутентификаторов пропускаются. Пустой список или список только из неизвестных значений не позволяет выполнить новый вход.

Встроенная проверка учётной записи

Аутентификатор base ищет сотрудника по логину в кеше ERP, отклоняет отключённую учётную запись и сравнивает введённый пароль с паролем ERP. Логин и пароль должны быть заполнены.

Учётную запись и её состояние администратор меняет в справочнике сотрудников. Пользователь меняет собственный пароль в профиле, если действие доступно по его правам.

Требования к паролю ERP

При сохранении пароля проверяются допустимые символы, длина и совпадение с подтверждением. Например:

user.password.length.min=12
user.password.length.max=64
user.password.chars=1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM@$!*?&

По умолчанию минимальная длина — 5, максимальная — 10, допустимые символы — набор из примера. Изменение этих настроек влияет на последующее сохранение паролей; существующие пароли при входе повторно по этим правилам не проверяются. Требования к доменному паролю задаются на стороне LDAP.

Вход через LDAP-менеджер

Для ldap_manager используйте полный логин вида employee@example.org. Менеджер подключается к ldap://example.org:389 с логином и паролем пользователя, ищет его по userPrincipalName и получает атрибуты LDAP. База поиска формируется из домена логина, например DC=example,DC=org.

Текущая реализация использует LDAP с simple-аутентификацией. Параметров выбора отдельного адреса LDAP-сервера, LDAPS или StartTLS у этого менеджера нет. Параметр auth.ldap.port относится к старому режиму ldap и не меняет порт ldap_manager.

Сопоставление сотрудника

После проверки доменного пароля менеджер получает employeeID. В ERP этот атрибут используется как идентификатор сотрудника; сообщения об ошибках называют его ИНН. Если атрибут пуст, вход отклоняется.

Сотрудник ищется по текстовому параметру, указанному в auth.ldap.identifier.id. По умолчанию используется параметр Уфанет с ID 1950.

  • Если сотрудник найден, используется существующая учётная запись ERP. Её логин и параметры при каждом входе не синхронизируются с LDAP.

  • Если сотрудник не найден, создаётся новая учётная запись. Имя собирается из sn, givenName, initials, логин — из userPrincipalName. Если такой логин уже занят другой учётной записью, создание отклоняется.

В текущем ldap_manager поиск включает активных и отключённых сотрудников, а отдельной проверки состояния найденной учётной записи нет. Отключение сотрудника в ERP блокирует встроенный вход base, но само по себе не гарантирует блокировку входа через этот менеджер.

Создание сотрудника и заполнение параметров

Параметр auth.ldap.creator выбирает способ заполнения параметров новой учётной записи. По умолчанию ufanet использует фиксированные ID параметров Уфанет. Для собственной схемы параметров задайте default и явные соответствия:

auth.types=ldap_manager
auth.ldap.creator=default

# Замените ID на параметры объекта «Сотрудник» в своей ERP.
# Этот параметр должен хранить employeeID и участвовать в поиске сотрудника.
auth.ldap.identifier.id=1950
auth.ldap.parameters.1.id=1950
auth.ldap.parameters.1.type=text
auth.ldap.parameters.1.value=employeeID

# Пример заполнения должности.
auth.ldap.parameters.2.id=1951
auth.ldap.parameters.2.type=text
auth.ldap.parameters.2.value=title

# Пример телефонного параметра.
auth.ldap.parameters.3.id=1952
auth.ldap.parameters.3.type=phone
auth.ldap.parameters.3.value=mobile
auth.ldap.parameters.3.format=11
auth.ldap.parameters.3.comment=Добавлено при создании пользователя из LDAP

Номера .1, .2, .3 группируют настройки одного соответствия. В id указывается положительный ID существующего параметра, а в value — имя поля LDAP-модели. Доступны employeeID, primaryGroupID, sn, givenName, initials, title, uSNCreated, department, company, userPrincipalName, mobile.

Поддерживаются типы text и phone; по умолчанию — text. Для телефона формат по умолчанию — 11, комментарий — «Добавлено при создании пользователя из LDAP». ID и типы должны соответствовать реально созданным параметрам ERP.

Обязательно сохраняйте employeeID в параметр auth.ldap.identifier.id: иначе следующий вход не найдёт созданного сотрудника по идентификатору.

auth.ldap.login.format=short сохраняет логин новой учётной записи без части @домен. Без этой настройки сохраняется полный userPrincipalName. Параметр меняет сохраняемый логин ERP, а не адрес LDAP-сервера.

При создании менеджер сохраняет введённый доменный пароль как пароль ERP. При дальнейших LDAP-входах он не обновляется. Если одновременно включён base, эта учётная запись может проходить встроенную проверку с сохранённым паролем ERP.

Короткий логин на форме входа

Чтобы разрешать ввод логина без домена, менеджер может предварительно искать полный userPrincipalName по sAMAccountName через служебную учётную запись:

ldap.username=ldap-reader@example.org
ldap.password=<пароль служебной учётной записи>
ldap.port=389

Эти настройки относятся к поиску полного логина. Основная проверка пароля сотрудника всё равно выполняется его учётной записью на порту 389. Без заполненных ldap.username и ldap.password, а также при неудачном поиске менеджер использует введённый логин как есть; для предсказуемого входа указывайте полный логин с доменом.

Права новой учётной записи

При создании сотрудника читаются действия из default.ldap.user.permissions.<номер>.action. Например, разрешение изменять собственную учётную запись:

default.ldap.user.permissions.1.action=ru.bgcrm.core.profile.struts.action.UserProfileAction:updateAccount

В action указывается идентификатор права в формате полное.имя.КлассаДействия:метод, как в каталоге прав ERP, а не URL страницы. Этот список применяется при создании и не заменяет настройку групп, наборов прав и отдельных действий сотрудника.

Дополнительно можно включить добавление новой учётной записи в группу по атрибуту department:

feature:kernel_authorizeByLdapGroup=true

Группа должна совпадать с department по названию либо содержать в своей конфигурации auth.ldap.department=<значение department>. Добавление выполняется, только если найдена ровно одна подходящая группа; период участия начинается при создании и не имеет даты окончания. Проверка выполняется при создании сотрудника, а не при каждом входе; изменения подразделения в LDAP автоматически членство не обновляют.

Подключение, таймауты и пул

Настройки клиента ldap_manager:

Параметр По умолчанию Назначение

ldap.connect.pool.enabled

false

Использовать пул LDAP-соединений JNDI.

ldap.connect.timeout

0

Таймаут подключения в миллисекундах; 0 — без ограничения.

ldap.read.timeout

0

Таймаут чтения в миллисекундах; 0 — без ограничения.

Пример с ограниченным временем ожидания:

ldap.connect.pool.enabled=false
ldap.connect.timeout=5000
ldap.read.timeout=10000

Дополнительная конфигурация пула через параметры JVM

Если пул включён, его общие ограничения задаются в параметрах запуска JVM:

-Dcom.sun.jndi.ldap.connect.pool.maxsize=20
-Dcom.sun.jndi.ldap.connect.pool.prefsize=10
-Dcom.sun.jndi.ldap.connect.pool.timeout=3000

maxsize ограничивает максимальный размер пула, prefsize задаёт предпочтительный размер, timeout — время неактивности соединения до удаления из пула в миллисекундах. Изменения параметров JVM требуют перезапуска приложения.

Старый LDAP-аутентификатор

Режим auth.types=ldap использует домены вида <короткий домен>.ufanet.ru, ищет sAMAccountName и сопоставляет employeeID с параметром ИНН ERP 1950. Для него предусмотрены:

  • auth.ldap.default_domain — короткий домен для логина без @домен;

  • auth.ldap.port — порт LDAP, по умолчанию 389.

Сотрудник должен уже существовать в ERP и быть активным. Настройки создания сотрудников и таймауты клиента из раздела ldap_manager этот аутентификатор не использует. Для новой конфигурации сначала проверьте пригодность ldap_manager и схему идентификаторов своей LDAP-службы.

Сеансы и интеграционные запросы

После входа браузер использует HTTP-сеанс. ERP сначала проверяет пользователя из существующего сеанса, затем токен и только после этого логин и пароль. Изменение списка auth.types относится к новым проверкам учётных данных и само по себе не завершает уже открытые сеансы.

sessionTimeout задаётся в секундах и используется для проверки прикладной активности. По умолчанию значение 0 отключает эту дополнительную проверку. Время жизни HTTP-сеанса и TTL в Redis — отдельная часть конфигурации; подробнее см. менеджер HTTP-сеансов. Открытые сеансы и их завершение описаны в профиле сотрудника.

Для интеграционных запросов поддерживаются учётные данные j_username / j_password и HTTP Basic. Заголовок Authorization: Token <идентификатор сеанса> использует существующий сеанс, а не отдельный бессрочный API-ключ. Параметр запроса authToSession=0 или настройка сотрудника disableSessions=true переводит запрос в режим служебного пользователя. Это не отключает проверку учётных данных и прав.

Проверка настройки и типичные ошибки

  1. Проверьте эффективное значение auth.types, включая переопределения из файла свойств.

  2. Выполните новый вход в отдельном сеансе браузера: уже открытая ERP не проверяет новый список аутентификаторов.

  3. Для LDAP сначала используйте полный логин с доменом. Проверьте доступность домена на порту 389 и заполнение employeeID.

  4. Убедитесь, что ID параметра сопоставления и сохранённое значение совпадают. Для новой учётной записи проверьте параметры, логин и выданные права.

Ошибка или симптом Что проверить

Пользователь не найден / неверный пароль ERP

Наличие сотрудника, его логин, состояние и пароль ERP; включён ли base.

«Неизвестный домен пользователя»

Для ldap_manager эта ошибка означает исключение связи с LDAP: проверьте домен, DNS, порт и доступность сервера.

«Авторизация отклонена»

LDAP отклонил аутентификацию. Возможны неверный или просроченный пароль и ограничения доменной учётной записи.

«Не удалось найти ИНН пользователя»

Атрибут employeeID пуст; сопоставление с сотрудником ERP невозможно.

Сообщение о занятом логине

Сотрудник не найден по employeeID, но сохраняемый логин ERP уже существует. Проверьте идентификатор и auth.ldap.login.format.

Ошибка LDAP с текстом о домене

NamingException имеет более широкие причины, чем отсутствие домена. Проверьте полный логин, базу поиска и журнал ошибок.

Вход успешен, нужный раздел недоступен

Права и группы сотрудника. Успешная проверка пароля не выдаёт права на все действия.