Пользователи Django, созданные через прокси, не могут войти - PullRequest
0 голосов
/ 01 декабря 2018

Я создал модель, унаследованную от django.contrib.auth.models.User , и расширил ее дополнительными полями, а затем создал прокси, который переопределяет метод save () дляхэшируйте пароль, но пользователи, созданные через этот прокси, не могут войти.Я проследил процесс и обнаружил, что 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)

И это мое ModelBackend :

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, не существует для UserExtendedProxy .

1 Ответ

0 голосов
/ 01 декабря 2018

Они не могут войти в систему, потому что вы вводите пароль в вашу модель прокси.Этот код в вашем методе save() будет повторно хэшировать значение хешированного пароля, установленное в self.password, так что исходный пароль будет закрыт:

 self.set_password(self.password)

Я не уверен, почему вы это делаете.set_password применяет алгоритм хеширования к строке (простой текстовый пароль), чтобы его можно было сохранить в базе данных.Нет смысла пытаться запустить его на уже хешированном пароле.

Если вы удалите эту строку, пароль не будет повторно хеширован, и они смогут войти в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...