我有一个基于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'>
答案 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