我使用LDAP创建自定义身份验证后端。 我想检查用户是否存在于数据库中,但是将“密码”密码检查委托给LDAP(由于公司政策,密码经常更改)。

使用Django管理界面时,后端工作良好,但是当我使用FormView创建自定义登录页面时,出现以下错误:

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

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)

account / 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

我错过了什么? 提前致谢。

#1楼 票数:3 已采纳

调用auth_login ,请执行self.request而不是form.request

  ask by bosha translate from so

未解决问题?本站智能推荐:

1回复

在Django中使用自定义用户模型登录时出现身份验证问题

我创建了一个自定义用户模型,它使用电子邮件字段作为用户名。 此外,我必须创建一个自定义后端来验证电子邮件字段是否区分大小写。 注册页面工作正常,但是当我尝试使用未创建的用户登录时,出现此错误:Environment:Request Method: POSTRequest URL: http://lo
2回复

自定义登录Django

我是django的新手,并且我有一个模型可以保存有关帐户用户名密码password salt的信息。 models .py-在字段上有一些RegExValdation。 我想获取密码,并使用password_salt字段对其进行Sha1Hash加密。 香港专业教育学院一直在搜索,但我似
1回复

自定义用户的不同登录视图

我的目标是有两种登录视图:一种带有电子邮件和密码,另一种带有用户名和密码。 从 AbstractBaseUser 创建了一个名为 MyUser 的自定义用户类。 在那个用户类中,稳定 默认情况下,Django 使用用户名字段进行用户身份验证。 当我希望用户使用电子邮件登录时,这很容易。 但是我该如何
1回复

用户身份验证无法正常工作Django

我尝试登录时用户未通过身份验证。 这是我的注册码 如果我的登录码是否为我使用的是user.object.get作为电子邮件,而check_password为的则为密码,这是正常的,但是当我使用身份验证时,则无法正常工作。 打印验证返回无
2回复

使用电子邮件作为用户名字段的自定义用户模型的登录用户

我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,其中我通过扩展AbstractBaseUser实现了自定义用户模型,现在我需要让用户登录到该站点。 这是我迄今为止尝试过的。 从models.py : 从urls.py : 从views.py : 从forms.py :
1回复

使用自定义身份验证后端进行身份验证后无法登录

在我的django应用中,我按照文档中的示例编写了一个自定义身份验证后端,该示例似乎运行良好。 (我通过电子邮件向用户发送包含签名令牌的登录URL;下面的视图处理了这些令牌登录URL。)我可以从日志消息中确认request.user的设置正确。 但是,受@login_required装饰器
1回复

无法将python社交身份验证导入使用自定义登录的Django应用

使用Django 1.6.5,为基于用户名/密码令牌的登录创建了自定义登录框架,但现在也希望实现一些社交登录。 唯一的问题是,现有的每个示例都在使用Django的内置模板等等,对您没有帮助。 在尝试使用python-social-auth我发现我对相对导入一无所知,尽管阅读了许多有关SO的
1回复

多个应用程序的Django身份验证

我想在Django项目中制作两个应用程序-一个用于网页(浏览器),另一个用于api调用(移动应用程序)。 两个应用程序应使用相同的用户进行身份验证。 那么我应该如何实施呢? 我想为用户开发一个应用程序,但这是仅使用一种模型却没有任何其他逻辑的应用程序的正确方法吗?