Нет подтверждения аутентификации (имя пользователя = имя пользователя, пароль = пароль) в django-python3-ldap

Я пытаюсь разработать то, что должно быть относительно простым веб-приложением, которое запрашивает у пользователя вход в систему через LDAP, а затем, в случае успешного входа в систему, пользователь может искать другого пользователя (пользователей) на сервере LDAP. Это приложение для администраторов. Пока что код создает/привязывается к серверу ldap, и после нахождения искомого пользователя отображается другая страница с учетными данными пользователя. Подключение через правильные учетные данные было подтверждено через ldap3library.

На второй веб-странице, отображающей учетные данные искомого пользователя (его имя пользователя, адрес электронной почты, номер мобильного телефона и т. д.), есть окно поиска, чтобы пользователь мог снова искать другого пользователя. Поэтому повторно логин не требуется. Проблема, с которой я столкнулся сейчас, заключается в том, как оставаться в системе через ldap, чтобы пользователю нужно было вводить только искомого пользователя (а не снова его имя пользователя и пароль).

Мой код:

settings.py

ALLOWED_HOSTS = ['127.0.0.1']

LDAP_AUTH_URL = 'ldap://10.253.53.53:389'                   
LDAP_AUTH_USE_TLS = None                                   # Initiate TLS on connection.
LDAP_AUTH_SEARCH_BASE = 'dc=vkbads,dc=de'  # The LDAP search base for looking up users.
LDAP_AUTH_OBJECT_CLASS = 'inetOrgPerson'                    # The LDAP class that represents a user.
LDAP_AUTH_USER_FIELDS = {
    "username": "cn",
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail",
}

#LDAP_AUTH_USER_LOOKUP_FIELDS = ("username",)
LDAP_AUTH_USER_LOOKUP_FIELDS = ("cn",)
LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"
LDAP_AUTH_FORMAT_SEARCH_FILTERS = "django_python3_ldap.utils.format_search_filters"
LDAP_AUTH_FORMAT_USERNAME = "django_python3_ldap.utils.format_username_active_directory"
LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = 'COMPANY'
LDAP_AUTH_CONNECTION_USERNAME = None
#LDAP_AUTH_CONNECTION_USERNAME = 'COMPANY\\e000520'
LDAP_AUTH_CONNECTION_PASSWORD = None 
LDAP_AUTH_CONNECT_TIMEOUT = None
LDAP_AUTH_RECEIVE_TIMEOUT = None
AUTHENTICATION_BACKENDS = (  
    'django_python3_ldap.auth.LDAPBackend',
    'django.contrib.auth.backends.ModelBackend',
)

views.py

def ldap_login(request): #This corresponds to my homepage
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        print ("username: {0}".format(username))
        print ("password: {0}".format(password))
        ldap_auth_search_dn = '{}\\{}'.format(settings.LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN, username)    
        print ("ldap_auth_search_dn: {0}".format(ldap_auth_search_dn))

        user = authenticate(username=username, password=password)
        #user = authenticate(username=ldap_auth_search_dn, password=password)
        print ("user: {0}".format(user))
        #login(request, user, backend='django_python3_ldap.auth.LDAPBackend')
        # Test return values
        if user and user.is_active:
            print ("user.is_active!!")
            login(request, user, backend='django_python3_ldap.auth.LDAPBackend')

    return render(request, 'login_ldap.html')

Странно то, что сообщения об ошибках не выдаются, но функциональность моего кода также не работает должным образом. Сначала я не мог правильно подключиться и получал: CommandError: Could not connect to LDAP server

Но затем благодаря дружескому совету понял, что мне нужно изменить настройки, чтобы они соответствовали AD, а не OpenLDAP. Кстати, я использую Python3 и Django1.11.

Это наводит меня на несколько вопросов о моей конфигурации:

  1. Обратите внимание на операторы печати в файле view.py. Они нужны для проверки un/pw и статуса пользователя. Когда выполняется runserver, выдается обычный вывод Django ("Performing system checks..." и т. д.). Затем, как ни странно, после обновления домашней страницы выдается следующее: username: last_username_I_input password: last_password_I_input ldap_auth_search_dn: COMPANY\ last_username_I_input user: None (i) Почему используются мои последние учетные данные, прежде чем я даже ввожу эти данные в поля на моей веб-странице? Почему хранятся мои последние учетные данные и есть ли способ как-то сбросить их автоматически? Я попробовал "python manage.py flush", вроде работает. Только когда ctrl+c не сбрасывает учетные данные. (ii) Даже когда я ввожу учетные данные un/pw на своей странице и нажимаю «Войти», а затем в операторах печати отображаются новые (и правильные) учетные данные, «пользователь» по-прежнему «Нет», но я не понимаю, почему. Почему мои учетные данные пользователя не проходят аутентификацию?

  2. По общему признанию, я не эксперт по Django и LDAP, поэтому некоторые настройки мне до сих пор неясны. Возможно, лучшее понимание могло бы помочь мне добиться правильной конфигурации: (i) Что такое правильный параметр для LDAP_AUTH_USE_TLS? (ii) Как обычно должен выглядеть LDAP_AUTH_SEARCH_BASE? Включает ли он, например, "ou"? (iii) должны ли LDAP_AUTH_CONNECTION_USERNAME и LDAP_AUTH_CONNECTION_PASSWORD содержать un/pw, если это именно то, что запрашивается на моей странице входа? (iv) Содержимое LDAP_AUTH_OBJECT_CLASS мне непонятно, и я не уверен, какой параметр следует сюда включить. Какие-нибудь советы? (v) То же, что и (iv), но для LDAP_AUTH_USER_FIELDS?


person pymat    schedule 06.11.2017    source источник
comment
@The_Cthulhu_Kid: спасибо за ваши постоянные советы, очень признателен! Параметр проверю позже (сейчас на другом заказчике). В настоящее время в настройках не заданы имя пользователя и пароль. Идея заключалась в том, чтобы получить их со страницы входа (инструмент предназначен только для администраторов). Затем они могут получить доступ к данным на сервере LDAP. Итак, вы подразумеваете, что un и pw должны быть жестко закодированы в настройках? Боюсь, это нанесет ущерб цели приложения.   -  person pymat    schedule 08.11.2017
comment
@The_Cthulhu_Kid: кстати, автор библиотеки написал мне ... Я могу напрямую отправить вам его совет. Напишите мне в личку, или я отследю вас по ссылке :)   -  person pymat    schedule 08.11.2017