【问题标题】:django authenticate() allways returns None [duplicate]django authenticate() 总是返回 None [重复]
【发布时间】:2015-09-23 13:44:21
【问题描述】:

我正在尝试创建一个自定义登录表单以针对远程服务器进行身份验证,因此我必须创建一个自定义登录表单。我创建了一个用户 django-shell 中的用户名='test3',密码='test'。当我尝试使用身份验证功能时,我总是得到无。当我尝试使用相同的用户名和密码登录时,我可以登录。我可以排除以下可能的错误: - 'django.contrib.auth.backends.ModelBackend' 列在 MIDDLEWARE_CLASSES 中:

MIDDLEWARE_CLASSES = (
    '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',
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.auth.backends.ModelBackend',
    )
  • 密码存储为hash(我用sqlite-browser检查过)
  • User.objects.get(username='test3').check_password('test') 返回真
  • 我在激活身份验证后端后执行了 syncdb、migrate 和 makemigrations

我正在使用 django 1.8 原则上,我只需要会话数据,因为用户存储在不同的地方。

今天早上,我意识到问题只是部分解决了: - authenticate() 在 shell 中工作 - 在我看来,我可以检索用户并成功检查其密码 但是话又说回来,当我尝试在我的视图中使用 authenticate() 函数时,我得到了一个 None 类型的对象。我什至删除了数据库,但行为仍然相同。 我的设置.py:

MIDDLEWARE_CLASSES = (
    '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.auth.middleware.RemoteUserMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.staticfiles.finders.FileSystemFinder',
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',                           
    #'django.contrib.auth.backends.RemoteUserBackend',
    )

浏览量: 从 django.contrib.auth.models 导入用户 从 django.contrib.auth 导入验证

def authentifizieren(request):
    """
    """
    if request.method == 'POST':
        uname = request.POST['username']
        passwd = request.POST['password']
        dbuser = User.objects.get(username=uname)
        dbuvalid=dbuser.check_password(passwd)
        auser = authenticate(username=uname, password=passwd)
        print('***************************************', dbuser,dbuvalid)
        print('***************************************', auser)
    if (auser != None):
        login(request, auser)
    return redirect('/startseite')

输出:

*************************************** test True
*************************************** None

我还硬编码了用户/密码字符串以排除与编码相关的问题,但没有成功。

【问题讨论】:

  • 这个问题只发生在shell还是视图中?你正在使用authenticate(username='test3', password='test')?你从哪里导入authenticate()
  • 从 django.contrib.auth 导入验证
  • 抱歉点击太快,它发生在视图和外壳中。我刚刚切换到 shell 以进行更快的测试。

标签: python django authentication


【解决方案1】:

django.contrib.auth.backends.ModelBackend 是身份验证后端,而不是中间件类。

您应该从MIDDLEWARE_CLASSES 设置中删除此身份验证后端条目。

另外,您需要将AUTHENTICATION_BACKENDS 定义为如下所示:

# Authentication backends
AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend', # default
        ..   # any other authentication backends
    )

【讨论】:

  • 啊,非常感谢,这很有帮助。我还不得不删除测试用户
猜你喜欢
  • 2015-12-21
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2014-05-14
相关资源
最近更新 更多