【问题标题】:Django Authenticate returns NoneDjango Authenticate 返回无
【发布时间】: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!!!

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

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

【问题讨论】:

  • 你有一些自定义设置吗?

标签: django authentication nonetype


【解决方案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)
          

          【讨论】:

            猜你喜欢
            • 2014-05-14
            • 1970-01-01
            • 2015-12-21
            • 1970-01-01
            • 2016-07-17
            • 1970-01-01
            • 2021-06-30
            • 1970-01-01
            • 2015-02-19
            相关资源
            最近更新 更多