@alexandrsemen4ukk

Как решить проблему с LDAP аутентификацией в Django?

Есть у меня сервер с контроллером домена и сервер с джанго. Хочу реализовать авторизацию через контроллер домена. Суть в чем: на боевом линукс сервере Django проект с ldap корректно выполняет авторизацию и создает пользователя в базе Джанго если его нет, но на боевом сервере работать не круто (1), неудобно (2).
Решил запустить проект у себя в PyCharm на винде, поставил все зависимости, все хотелки и ругалки в итоге запустил, но вот авторизация по LDAP не работает
Caught LDAPError while authenticating aleksandr.semenchuk@my.group: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})
и хоть убей. При этом в соседнем test.py запускаю поиск и авторизация выполняется и даже поиск по домену работает.

import ldap

    server = "ldap://192.168.101.37"  # Сервер LDAP
    bind_dn = "aleksandr.semenchuk@my.group"  # Учетная запись для аутентификации
    password = "MyPass"  # Пароль для аутентификации

    # Параметры поиска
    base_dn = "OU=RAZUMUsers,DC=razum,DC=group"  # Базовый DN, откуда начнется поиск
    search_filter = "(sAMAccountName=aleksandr.semenchuk)"  # Фильтр для поиска пользователя
    search_scope = ldap.SCOPE_SUBTREE  # Уровень поиска: везде под base_dn
    retrieve_attributes = ["cn", "mail", "title", "department"]  # Атрибуты, которые нужно извлечь

    try:
        # Подключение к серверу
        conn = ldap.initialize(server)
        conn.set_option(ldap.OPT_PROTOCOL_VERSION, 3)  # Используем версию протокола LDAP 3
        conn.simple_bind_s(bind_dn, password)  # Выполнение аутентификации

        print("LDAP connection successful! Performing search...")

        # Выполнение поиска
        result = conn.search_s(base_dn, search_scope, search_filter, retrieve_attributes)

        # Обработка результатов поиска
        for dn, entry in result:
            print(f"DN: {dn}")
            for attr, values in entry.items():
                print(f"{attr}: {values}")

        conn.unbind_s()  # Закрытие подключения
    except ldap.LDAPError as e:
        print(f"LDAP connection or search failed: {e}")


Так же прилагаю settings.py из джанго
# Основные настройки LDAP
AUTH_LDAP_SERVER_URI = "ldap://192.168.101.37"
# AUTH_LDAP_START_TLS = True

# Опционально добавь резервный контроллер домена
AUTH_LDAP_CONNECTION_OPTIONS = {
    ldap.OPT_PROTOCOL_VERSION: 3,
    ldap.OPT_REFERRALS: 0,
    ldap.OPT_NETWORK_TIMEOUT: 10,
    ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_NEVER,  # Отключает проверку сертификатов
}

# Настройки поиска пользователей
AUTH_LDAP_BIND_DN = "aleksandr.semenchuk@my.group"  # Данные пользователя для соединения с AD
AUTH_LDAP_BIND_PASSWORD = "MyPass"

AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "OU=RAZUMUsers,DC=razum,DC=group",
    ldap.SCOPE_SUBTREE,
    "(userPrincipalName=%(user)s)"
)

# Опционально: установка базовых атрибутов пользователя
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": decode_if_bytes("givenName"),
    "last_name": decode_if_bytes("sn"),
    "email": decode_if_bytes("mail"),
    "organization": decode_if_bytes("company"),  # Поле для организации
    "position": decode_if_bytes("title"),  # Поле для должности
}

# Настройка синхронизации групп из AD
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    "OU=RAZUMUsers,DC=razum,DC=group",
    ldap.SCOPE_SUBTREE,
    "(objectClass=group)"
)

AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()

# Включаем автоматическое создание пользователей в Django
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_MIRROR_GROUPS = True

# Использование LDAP для аутентификации
AUTHENTICATION_BACKENDS = [
    'django_auth_ldap.backend.LDAPBackend',  # LDAP бэкенд
    'django.contrib.auth.backends.ModelBackend',  # Бэкенд Django по умолчанию
]

# Логирование LDAP
import logging

logger = logging.getLogger('django_auth_ldap')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)

Как заставить эту скотину работать так же четко как на linux? Все пакеты проверил по версиям, все идентичны.
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ответы на вопрос 1
@LennyK79
SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': []})


точно ничего не зарезано файрволом со стороны LDAP сервера или Вашей рабочей станции? Для начала, 192.168.101.37 хотя бы пингуется?

Валится же не по причине какой-то непонятной ошибки, а по вполне конкретному поводу - SERVER DOWN
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы