Skip to content

LDAP провайдер аутентификации

Описание

Этот провайдер аутентификации проверяет учетные данные пользователя в LDAP, а затем выдает токен доступа.

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

После успешной аутентификации имя пользователя сохраняется в базе данных бэкенда. Затем оно используется для создания записей аудита при любом изменении объекта, см. поле changed_by.

ПРЕДУПРЕЖДЕНИЕ

Пока токен действителен, запросы к LDAP для проверки существования пользователя и его блокировки не выполняются. Поэтому не устанавливайте слишком длительное время истечения срока действия токена доступа (например, больше дня).

Стратегии

ПРИМЕЧАНИЕ

Базовая терминология LDAP объясняется здесь: Обзор LDAP

Существуют 2 стратегии проверки пользователя в LDAP:

  • Попытка вызвать запрос bind в LDAP с DN (DistinguishedName) и паролем пользователя. DN генерируется с использованием bind_dn_template
  • Сначала попытка поиска пользователя (запрос search) в LDAP для получения DN пользователя с помощью некоторого запроса, а затем попытка вызвать bind с использованием этого DN. См. настройки поиска

По умолчанию используется стратегия поиска, так как она может найти пользователя в сложной среде LDAP/ActiveDirectory. Например:

  • вы можете искать пользователя по uid, например, (uid={login}) или (sAMAccountName={login})
  • вы можете искать пользователя по нескольким атрибутам, например, (|(uid={login})(mail={login}@domain.com))
  • вы можете фильтровать записи, например, (&(uid={login})(objectClass=person)
  • вы можете фильтровать пользователей, соответствующих определенной группе или другому условию, например, (&(uid={login})(memberOf=cn=MyPrettyGroup,ou=Groups,dc=mycompany,dc=com))

После того как пользователь найден в LDAP, его uid_attribute используется для записей аудита.

Схема взаимодействия

sequenceDiagram
participant "Клиент"
participant "Бэкенд"
participant "LDAP"
activate "Клиент"
alt Успешный кейс
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
"Бэкенд" ->> "Бэкенд" : Создание пользователя, если не существует
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
end
alt Успешный кейс
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" ->> "Бэкенд" : Получение данных
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
end
deactivate "Клиент"
sequenceDiagram
participant "Клиент"
participant "Бэкенд"
participant "LDAP"
"Бэкенд" ->>o "LDAP"  : bind(lookup.username, lookup.password)
Note right of "LDAP" : Открытие пула\nсоединений для\nпоисковых запросов\n(опционально, рекомендуется)
activate "Клиент"
alt Успешный кейс
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->>o "LDAP" : Вызов search(query, base_dn, attributes=*)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
"Бэкенд" ->> "Бэкенд" : Создание пользователя, если не существует
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->>o "LDAP" : Вызов search(query, base_dn, attributes=*)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->>o "LDAP" : Вызов search(query, base_dn, attributes=*)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->>o "LDAP" : Вызов search(query, base_dn, attributes=*)
"Бэкенд" ->> "LDAP"  : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
else
"Клиент" ->> "Бэкенд"  : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
end
alt Успешный кейс
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" ->> "Бэкенд" : Получение данных
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
else
"Клиент" ->> "Бэкенд"  : access_token
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
end
deactivate "Клиент"

-->