Приложение аутентификации django с помощью ldap3

У меня проблема с аутентификацией пользователей в моем приложении django. Я использую Python 3.5 и Django 1.10.

Я написал простую конфигурацию связывания, чтобы проверить, действительно ли пользователь является пользователем из базы данных:

    username = request.POST['username']
    password = request.POST['password']

    server = Server(LDAP_AUTH_URL)
    c = Connection(server, user=LDAP_AUTH_CONNECTION_USERNAME, password=LDAP_AUTH_CONNECTION_PASSWORD)

    c.open()
    c.bind()

    if c.bind():
        user_search_filter = '(uid={})'.format(username)
        c.search(search_base=LDAP_AUTH_SEARCH_BASE,
                 search_filter=user_search_filter,
                 search_scope=SUBTREE)

    username = c.response[0]['dn']
    if c.rebind(user=username, password=password):
        return HttpResponseRedirect(next)

но теперь я не знаю, что с этим делать, в django у нас, конечно, что-то вроде этого:

    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            auth.login(request, user)
            return HttpResponseRedirect(next)
        else:
            return render(request, 'login.html', {'error_message': 'Your account has been disabled'})
    else:
        return render(request, 'login.html', {'error_message': 'Invalid login'})

но в этой ситуации мы должны иметь учетную запись пользователя в нашей базе не из авторизации ldap.

поэтому я хотел бы получить авторизацию от django, когда я регистрируюсь в ldap, чтобы иметь доступ к любому другому представлению с "@login_required"

Возможно, что-то не так с моим представлением о ldap и ldap3 для Python >3.

Кто-нибудь может мне помочь или дать мне полезные ссылки?

2 ответа

Решение

Раздельное управление авторизацией пользователей.

Добавьте функцию, чтобы проверить авторизацию ldap. Скажи, что вернется True/False по предоставленным учетным данным.

def ldap_auth(login, password):
    ...
    return c.bind()

Таким образом, в представлении авторизации вам теперь нужно два разных условия для пользователей ldap и не-ldap:

# if it is ldap user check ldap_auth
# if user doesn't exist locally you could create it manually in case of successful auth
else:
    user = authenticate(username=username, password=password)

На веб-интерфейсе нужно как-то указать, является ли он пользователем ldap или нет. Или вы можете пойти дальше и добавить логику, основанную на нескольких проверках: попробуйте найти пользователей у обычных пользователей, если результатов нет - попробуйте войти через ldap.

Добавьте сервер аутентификации django для аутентификации LDAP, например:/users/auth/backend.py и настройте этот бэкэнд в вашем файле settings.py, чтобы django использовал его для всех входов в систему.

И добавить authenticate() метод, который реализует аутентификацию LDAP. Вам также необходимо реализовать get_user() метод.

Рекомендуется синхронизировать учетную запись пользователя из LDAP при первом входе в систему или при первом поиске пользователя в активном каталоге из вашего приложения и поддерживать модель пользователей для вашего приложения.

Более подробную информацию о настройке аутентификации и синхронизации пользователей можно найти здесь:

Настройка аутентификации Django Bakcend

Другие вопросы по тегам