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 "Клиент"
-->