Единая учетная запись пользователя
В системе реализован механизм единой учётной записи, позволяющий связать несколько способов аутентификации с одним пользователем. Вместо создания отдельных аккаунтов для локального входа, LDAP и OIDC, администратор настраивает правила сопоставления, а система автоматически предлагает объединить учётные записи при совпадении логина.
Назначение
Единая учётная запись решает задачу управления правами при использовании нескольких способов аутентификации. Права доступа, атрибуты и роли настраиваются один раз для пользователя, независимо от того, каким способом он входит в систему.
Без механизма единой УЗ администратору пришлось бы создавать отдельного пользователя для каждого способа входа и дублировать настройки прав доступа. С единой УЗ пользователь, созданный локально, может позднее войти через LDAP или OIDC — система обнаружит совпадение и предложит связать аккаунты.
Единая учётная запись позволяет пользователю входить в систему любым настроенным способом (локальный пароль, LDAP, OIDC), сохраняя единый набор прав доступа и атрибутов.
Что объединяется
К одному пользователю могут быть привязаны следующие источники аутентификации:
- Локальная учётная запись — аутентификация по логину и паролю, хранящимся в системе.
- LDAP-аккаунты — один или несколько LDAP-серверов. Одновременно может быть настроено несколько подключений к LDAP.
- OIDC-аккаунты — один или несколько провайдеров OpenID Connect. Одновременно может быть настроено несколько OIDC-провайдеров.
| Источник аутентификации | Множественность | Ключ сопоставления |
|---|---|---|
| Локальная учётная запись | 1 | login |
| LDAP-сервер | 1..N | Результат login_expression |
| OIDC-провайдер | 1..N | Результат login_expression |
К одному пользователю может быть привязано произвольное количество LDAP-серверов и OIDC-провайдеров одновременно.
Механизм сопоставления учётных записей
Ключ сопоставления — логин
Признаком совпадения учётных записей при аутентификации является совпадение логина. При входе через LDAP или OIDC значение логина вычисляется из ответа провайдера с помощью JQ-выражения login_expression. Это выражение настраивается индивидуально для каждого LDAP-сервера и OIDC-провайдера.
Если вычисленный логин совпадает с полем login существующего пользователя в системе, возникает возможность объединения учётных записей.
Выражение login_expression для LDAP
Выражение login_expression — это JQ-выражение, которое применяется к атрибутам LDAP-записи аутентифицированного пользователя. Результатом должно быть строковое значение, используемое в качестве логина.
Настраивается в: Настройки → Пользователи → LDAP → [сервер] → секция «Маппинг атрибутов»
Примеры выражений:
| LDAP-каталог | Атрибут | Выражение login_expression |
|---|---|---|
| Microsoft Active Directory | sAMAccountName | .sAMAccountName |
| OpenLDAP | uid | .uid |
| Произвольный | mail (до @) | .mail | split("@")[0] |
Выражение login_expression для OIDC
Выражение login_expression — это JQ-выражение, которое применяется к ответу userinfo от OIDC-провайдера. Результатом должно быть строковое значение, используемое в качестве логина.
Настраивается в: Настройки → OIDC → [провайдер] → секция «Маппинг атрибутов»
Примеры выражений:
| OIDC-провайдер | Поле userinfo | Выражение login_expression |
|---|---|---|
| Keycloak | preferred_username | .preferred_username |
| Универсальный | email | .email |
| Универсальный | sub | .sub |

Выражение login_expression (JQ-выражение для логина) должно возвращать строку, совпадающую с полем login существующего пользователя. Если выражение настроено некорректно, система не сможет сопоставить учётные записи.
Процесс объединения учётных записей
Последовательность шагов:
- Пользователь выбирает вход через LDAP-сервер или OIDC-провайдер на странице входа.
- Система аутентифицирует пользователя через выбранный провайдер.
- Из ответа провайдера извлекается логин с помощью выражения
login_expression. - Система проверяет, существует ли пользователь с таким логином.
- Если пользователь не найден — создаётся новый аккаунт. Если найден — происходит перенаправление на форму объединения.
- Пользователь подтверждает владение существующей учётной записью одним из доступных способов.
- Учётные записи связываются, пользователь входит в систему.
Форма подтверждения объединения
При обнаружении совпадения логина пользователь перенаправляется на форму подтверждения объединения. Форма отображает предупреждение и доступные способы подтверждения.
Пользователь с логином "example_user" уже есть в системе. Для объединения учётных записей подтвердите пароль от существующего аккаунта.
Доступные способы подтверждения определяются автоматически на основании методов аутентификации, уже связанных с существующей учётной записью.
Способ 1: Подтверждение паролем локальной учётной записи
Доступен, если у существующего пользователя установлен локальный пароль. Поле логина предзаполнено и заблокировано для редактирования. Пользователь вводит пароль от существующей учётной записи. При успешной проверке внешний аккаунт (LDAP/OIDC) привязывается к существующему пользователю.
Способ 2: Подтверждение через LDAP
Доступен, если к существующей учётной записи уже привязаны LDAP-серверы. Форма отображает выпадающий список доменов LDAP. Пользователь выбирает домен, вводит логин и пароль. При успешной аутентификации через выбранный LDAP-сервер новый внешний аккаунт привязывается к существующему пользователю.
Способ 3: Подтверждение через OIDC
Доступен, если к существующей учётной записи уже привязаны OIDC-провайдеры. Форма отображает кнопки для каждого привязанного провайдера. При нажатии на кнопку выполняется OAuth-авторизация через выбранный провайдер. После успешной аутентификации новый внешний аккаунт привязывается к существующему пользователю.
Если у пользователя настроено несколько способов аутентификации (например, локальный пароль и LDAP), форма покажет все доступные варианты подтверждения. Пользователь может выбрать любой из них.