Py学习  »  Django

通过代理创建的django用户无法登录

HuLu ViCa • 4 年前 • 549 次点击  

我创建了一个继承自 django.contrib.auth.models.user用户 ,并用更多字段扩展它,然后创建一个覆盖 保存() 方法散列密码,但通过此代理创建的用户无法登录。我追踪过程发现 user.check_password() 总是失败,但我不知道原因。

这是我的模型及其代理:

class UserExtended(User):
    albums = models.ManyToManyField(Album, null=True, blank=True, verbose_name='Albums')

    class Meta:
        verbose_name = _("User")
        verbose_name_plural = _("Users")

    def __str__(self):
        return "[{}] {} ({})({}{})".format(self.id, self.email, self.username, self.first_name, self.last_name)

class UserExtendedProxy(UserExtended):
    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        if not self.id:
            try:
                user = User.objects.get(email=self.email)
            except:
                pass
            else:
                raise Exception('eMail already in use.')

        self.set_password(self.password)
        super(UserExtendedProxy, self).save(*args, **kwargs)
        Token.objects.create(user=self)

这是我的 模型后端 :

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwars):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user

        return None

我可以在我的数据库中看到,通过这个代理创建的用户实际上存在于 django.contrib.auth.models.user用户 模型,所以我不明白他们为什么不能登录。

另一个问题是通过 python manage.py createsuperuser 不存在的原因 用户扩展代理 .

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43173
 
549 次点击  
文章 [ 1 ]  |  最新文章 4 年前
solarissmoke
Reply   •   1 楼
solarissmoke    5 年前

他们无法登录,因为您在代理模型中弄乱了他们的密码。你的代码 save() 方法将重新散列在中设置的散列密码值。 self.password 这样原始密码就被破坏了:

 self.set_password(self.password)

我不知道你为什么这么做。 set_password 对字符串(纯文本密码)应用哈希算法,以便将其保存到数据库中。尝试在已经散列的密码上运行它是没有意义的。

如果删除该行,密码将不会被重新散列,它们应该能够登录。