django使用有效凭据验证返回的Nonetype

时间:2015-11-28 22:19:20

标签: python django

我有一个基于AbstractUser的自定义用户模型,并且我使用自定义UserManager,我不知道是否有任何特殊的东西我必须做以获得身份验证才能工作。我知道用户在db中,因为我可以执行objects.get(用户名,密码),它将返回对象。

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'>

1 个答案:

答案 0 :(得分:2)

使用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