【问题标题】:django authenticate returning Nonetype with valid credentialsdjango 使用有效凭据进行身份验证返回 Nonetype
【发布时间】:2015-11-28 22:19:20
【问题描述】:

我有一个基于 AbstractUser 的自定义用户模型,并且我使用自定义 UserManager,我不知道是否需要做任何特别的事情才能使身份验证工作。我知道用户在数据库中,因为我可以执行 objects.get(username, password) 并且它会返回对象。

class PassThroughFarmerManager(PassThroughManagerMixin, UserManager):
        use_in_migrations = False

class Farmer(FarmStateble, MapPointable, LastRequestStorable, AbstractUser):
        last_irrigation_cycle = models.DateTimeField(auto_now_add=False, auto_now=False, null = True, blank=True)
        objects = PassThroughFarmerManager.for_queryset_class(FarmerQuerySet)()

这是我的控制台输出的示例,

>>> models.Farmer.objects.get(username='901e2ac5-9324-11e5-81bf-c42c0323e33a').password
u'1223'
>>> u = authenticate(username = '901e2ac5-9324-11e5-81bf-c42c0323e33a', password = '1223')
>>> u
>>> type(u)
<type 'NoneType'>

【问题讨论】:

  • 创建用户时是否正确散列密码,例如通过致电user.set_password('new password')?如果您使用get() 获取用户,它会显示什么?如果它显示未加密的密码,例如'1223',那你就做错了。
  • @Alasdair 我正在通过 objects.create(username, password) 创建用户,下班回家后我得试试你说的内容

标签: python django


【解决方案1】:

当您使用MyUserModel.objects.create(...) 时,密码以纯文本形式存储在数据库中。对authenticate 的调用不起作用,因为 Django 期望密码在数据库中进行哈希处理。

因此,在创建用户时,需要确保密码经过哈希处理,而不是以纯文本形式存储在数据库中。您可以通过调用user.set_password('new_password') 来完成此操作。

文档中的full example 显示了一个create_user 管理器方法,该方法在创建用户时调用set_password。然后,您将使用 MyUserModel.objects.create_user(...) 而不是 MyUserModel.objects.create(...)

class MyUserManager(BaseUserManager):
    def create_user(self, email, date_of_birth, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            date_of_birth=date_of_birth,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2014-09-25
    • 2017-03-29
    相关资源
    最近更新 更多