Python Can';t使用自定义身份验证后端登录
我正在使用LDAP创建自定义身份验证后端。我想检查数据库中是否存在用户,但将密码检查“委托”给LDAP(密码更改通常是由于公司策略) 使用django管理界面时,后端工作正常,但使用FormView创建自定义登录页时,出现以下错误:Python Can';t使用自定义身份验证后端登录,python,django,authentication,django-models,Python,Django,Authentication,Django Models,我正在使用LDAP创建自定义身份验证后端。我想检查数据库中是否存在用户,但将密码检查“委托”给LDAP(密码更改通常是由于公司策略) 使用django管理界面时,后端工作正常,但使用FormView创建自定义登录页时,出现以下错误: Environment: Request Method: POST Request URL: http://localhost:8000/accounts/login/ Django Version: 1.7 Python Version: 3.4.2 Ins
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'
设置.py
AUTHENTICATION_BACKENDS = (
#'django.contrib.auth.backends.ModelBackend',
'account.LDAPBackend.LDAPBackend',
)
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
我错过什么了吗?提前感谢。当调用
验证登录时,请执行自我请求
,而不是表单请求
调用auth\u login
时,执行self.request
而不是form.request
调用auth\u login
时,执行self.request
而不是form.request
调用auth\u login
时,执行self.request
而不是form.request
您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试了此项目的fork-但效果不好,因此我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试了此项目的fork-但效果不好,因此,我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试使用此项目的fork-但它们工作不好,所以我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,我尝试过这个项目的分支,但它们并不好用,所以我决定创建自己的简单后端。不用担心,它会发生。从技术上讲,他们(Django)不应该在表单上有request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?