Django Authenticate 返回无

Posted

技术标签:

【中文标题】Django Authenticate 返回无【英文标题】:Django Authenticate returns None 【发布时间】:2013-09-10 20:48:51 【问题描述】:

我有以下代码sn-p:

user = User(username='h@h.com',email='h@h.com')
user.set_password('pass')
user.save()
u = authenticate(username='h@h.com', password='pass') #this always returns None!!!

问题是,你总是无。我已经关注了其他堆栈溢出帖子上的代码示例,并将其范围缩小到上述几行。

对可能发生的事情有任何想法吗?

【问题讨论】:

你有一些自定义设置吗? 【参考方案1】:

为什么不创建这样的用户:

user = User.objects.create_user( username="whatever", email="whatever@some.com", password="password")
user = authenticate( username="whatever",password="password")

【讨论】:

谢谢,H H H。那是我的原始代码。我把它改回来了,仍然没有荣耀。让我在下面的答案中发布代码... -1。这是错误的。这样,密码将被保存为未经哈希处理,并且在与哈希版本检查时将不匹配。 Daniel,我对此进行了测试,它正在对密码进行哈希处理。是否是不同的密码,我永远不会知道,但它肯定是经过哈希处理的。我的问题是我缺少身份验证后端设置【参考方案2】:

有趣的是,check_password 在下面返回 True:

eml = "4@a.com"
pw = "pass"
uname = 'w2'
user = User.objects.create_user(uname,eml,pw)
user.save()
log.debug("Password check passes?")
log.debug(user.check_password(pw)) # Logs True!!!
user = authenticate(username=uname, password=pw)

【讨论】:

您好,我使用相同的代码进行检查,但仍然显示错误密码检查通过?虚假注册用户检查无内部服务器错误:/register/【参考方案3】:

在你的设置中加入类似的东西

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

或者,如果您将 userena 用于您的帐户

#Authentication backends
AUTHENTICATION_BACKENDS = (
    'userena.backends.UserenaAuthenticationBackend',
    'guardian.backends.ObjectPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)

【讨论】:

【参考方案4】:

在settings.py中添加

AUTH_USER_MODEL = your custom user class

例如,如果 django 应用程序名称是 office 并且自定义用户类是 Account 那么

AUTH_USER_MODEL = 'office.Account'

【讨论】:

【参考方案5】:

还要检查您的用户名/密码组合是否正确。有时,从 createsuperuser 命令创建的用户名与您通常使用的用户名不同。

【讨论】:

【参考方案6】:

set_password 是一种误导方法,它不会将密码保存在用户表中。您需要致电 user.save() 以便它在您的流程中运行

【讨论】:

【参考方案7】:

正如大多数人建议的那样,如果我们使用User.objects.create_user(**validated_data) 创建用户,这将散列原始密码并存储散列密码。如果您使用用户模型serializers 来验证和创建用户,则需要像这样覆盖序列化程序方法

class UserSerializers(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = "__all__"

    # this is the method responsible for insertion of data with hashed password
    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

【讨论】:

以上是关于Django Authenticate 返回无的主要内容,如果未能解决你的问题,请参考以下文章

Django authenticate() 函数查找不到与提交的用户名和密码匹配的用户,则会返回 None。

django 内置模块auth的login与authenticate功能简单测试

Django的用户认证组件

Django之用户认证组件

django的auth认证,is_authenticate 和装饰器的2个方法,注销的功能,

django认证登录时,返回的user=None