Перейти к содержанию

Авторизация с помощью LDAP

В приложении доступна авторизация через протокол LDAP.

Для подключения необходимо:

  1. В выпадающем списке выбрать "Вход с использованием LDAP"
  2. Ввести логин (без адреса сервера, он задается в конфигурационном файле системы) и пароль пользователя.
  3. Нажать на кнопку "Войти":

Настройки подключения

Для корректного подключения, необходимо наличие группы в приложении, имеющей такое же название, как и группа в 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))