Приложение аутентификации 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 при первом входе в систему или при первом поиске пользователя в активном каталоге из вашего приложения и поддерживать модель пользователей для вашего приложения.
Более подробную информацию о настройке аутентификации и синхронизации пользователей можно найти здесь: