不能自定义认证后端登录 [英] Can't login with custom authentication backend
本文介绍了不能自定义认证后端登录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用LDAP创建自定义的认证后端。我想检查是用户在数据库中存在,但代表密码检查LDAP(密码更改通常是由于公司政策)。
I creating custom authentication backend using LDAP. I want to check is user exist in database, but "delegate" password check to LDAP (password changes often due to company policy).
后端工作良好使用Django的管理界面的时候,但我创建具有FormView的自定义登录页面时,我收到以下错误:
Backend work well when using django admin interface, but when I creating custom login page with FormView i getting following error:
Environment:
Request Method: POST
Request URL: http://localhost:8000/accounts/login/
Django Version: 1.7
Python Version: 3.4.2
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'widget_tweaks',
'defekts',
'account')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/var/www/django_local/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch
87. return handler(request, *args, **kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/edit.py" in post
173. return self.form_valid(form)
File "/var/www/django_local/local/account/views.py" in form_valid
17. auth_login(form.request, user)
File "/var/www/django_local/lib/python3.4/site-packages/django/contrib/auth/__init__.py" in login
86. if SESSION_KEY in request.session:
Exception Type: AttributeError at /accounts/login/
Exception Value: 'NoneType' object has no attribute 'session'
settings.py
settings.py
AUTHENTICATION_BACKENDS = (
#'django.contrib.auth.backends.ModelBackend',
'account.LDAPBackend.LDAPBackend',
)
views.py
views.py
from django.contrib.messages.views import SuccessMessageMixin, messages
from django.core.urlresolvers import reverse, reverse_lazy
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.views.generic import FormView
# Create your views here.
class LoginView(FormView):
form_class = AuthenticationForm
template_name = 'account/login.html'
success_url = reverse_lazy("defekts:index")
def form_valid(self, form):
user = form.get_user()
auth_login(form.request, user)
return super(LoginView, self).form_valid(form)
帐户/ LDAPBackend / 的init 的.py
import ldap
from django.contrib.auth.models import User, check_password
from django.contrib.auth import get_user_model
class LDAPBackend(object):
def authenticate(self, username=None, password=None):
if username is None:
return None
try:
# user = User.objects.get(username=username)
user = get_user_model().objects.get(username=username)
except User.DoesNotExist:
# TODO: Raise error
return None
try:
connection = ldap.initialize("ldap://example.com")
connection.protocol_version = ldap.VERSION3
connection.simple_bind_s("example.com\\"+username, password)
except ldap.INVALID_CREDENTIALS:
return None
except ldap.SERVER_DOWN:
# TODO: Return error instead of none
return None
return user
def get_user(self, userid):
try:
return User.objects.get(pk=userid)
except User.DoesNotExist:
return None
我错过了什么?先谢谢了。
Did I miss something? Thanks in advance.
推荐答案
致电时 auth_login
,DO self.request获取
而不是 form.request
。
When calling auth_login
, do self.request
and not form.request
.
这篇关于不能自定义认证后端登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文