Авторизация с помощью LDAP
В приложении доступна авторизация через протокол LDAP.
Для подключения необходимо:
- В выпадающем списке выбрать "Вход с использованием LDAP"
- Ввести логин (без адреса сервера, он задается в конфигурационном файле системы) и пароль пользователя.
- Нажать на кнопку "Войти":
Настройки подключения
Для корректного подключения, необходимо наличие группы в приложении, имеющей такое же название, как и группа в LDAP, к которой относится пользователь.
Группы пользователя, для которых нет аналогов в системе, будут пропущены. Пользователь может входить в несколько групп одновременно.
Допустимо наличие пользователя без групп вообще.
В файле конфигурации в разделе Настройки авторизации и аутентификации подраздела Легковесный протокол доступа
к каталогам Lightweight Directory Access Protocol (LDAP), доступны следующие настройки:
ldap_allow_login- флаг возможности авторизации через LDAP;ldap_host- адрес сервера LDAP. Можно указывать несколько серверов через разделитель ";" (точка с запятой);ldap_port- порт сервера LDAP, по умолчанию - 389;ldap_use_ssl- использование ssl, по умолчанию - выключено;ldap_timeout- время ожидания для подключения. По умолчанию значение-1- не ограничено;ldap_user_host- адрес сервера, на котором зарегистрирован пользователь;ldap_domain_component- адрес доменного имени (domain component, dc) для пользователя;ldap_users_partition- адрес до раздела с пользователями (если оставить пустой, то поиск будет происходить по всему домену)ldap_username- атрибут на сервере, отвечающий за логин пользователя. Поле обязательно к заполнению;ldap_groups- атрибут на сервере, отвечающий за группы пользователя. Поле обязательно к заполнению;ldap_first_name- атрибут на сервере, отвечающий за имя пользователя;ldap_last_name- атрибут на сервере, отвечающий за фамилию пользователя;ldap_email- атрибут на сервере, отвечающий за электронную почту пользователя;-
ldap_sync_groups_with_ad- флаг синхронизации групп при логине пользователя. По умолчанию - включено.С флагом ldap_sync_groups_with_ad при каждом подключении пользователя будут сопоставляться группы, в которых он находится в системе, и те, в которых он находится в LDAP. Таким образом, если добавить пользователя в новую группу, не связанную с LDAP, то последующий вход в систему удалит эту группу у пользователя (т.к. в LDAP пользователь не состоит в этой группе).
-
ldap_default_group- имя группы по умолчанию (группа, к которой будет присоединен новый пользователь при выключенном флагеldap_sync_groups_with_ad).При отсутствии (или некорректной) группы в приложении вход через LDAP будет невозможен и будет выдана ошибка (коды ошибок 1522 и 1523).
Нюансы подключения LDAP
Для авторизации через LDAP используется библиотека python-ldap.
Параметр ldap_use_ssl определяет, как будет производится подключение по LDAP: ldaps:// при включенном SSL и ldap:// при выключенном.
Для проверки подключения LDAP можно использовать следующий код (через блок Python):
import ldap
from ldap.ldapobject import LDAPObject
# Параметры подкючения LDAP
ldap_host = ""
ldap_port = 389
ldap_use_ssl = 0
ldap_timeout = -1
ldap_user_host = ""
ldap_domain_component = ""
ldap_users_partition = ""
ldap_username = ""
# Логин/пароль для входа в систему
user_login = ""
user_password = ""
hosts: List[str] = ldap_host.split(';')
host = f"{hosts[0]}:{port}" if ldap_port else hosts[0]
uri: str = f"ldaps://{host} if ldap_use_ssl else f"ldap://{host}"
try:
# Инициализация соединения
conn = ldap.initialize(uri, trace_level=2)
# Настройки соединения
conn.timeout = ldap_timeout
conn.protocol_version = 3
conn.set_option(ldap.OPT_REFERRALS, 0)
# Тест соединения
whoami = conn.whoami_s()
execution_context.log.info(f"{whoami}")
except ldap.LDAPError as E:
execution_context.log.error(str(E))
try:
username = f"{user_login}@{ldap_user_host}" if ldap_user_host else user_login
conn.simple_bind_s('username', 'user_password')
except ldap.INVALID_CREDENTIALS as E:
execution_context.log.error(str(E))
base: str = f"{ldap_users_partition},{ldap_domain_component}" if ldap_users_partition else ldap_domain_component
result = conn.search_ext_s(base, ldap.SCOPE_SUBTREE, filterstr=f"(&({ldap_username}={user_login}))")
execution_context.log.info(str(result))
