Задать вопрос
@ArsLonga

Почему Django authenticate может не хешировать пароль?

Здравствуйте. Возникла проблема с системой авторизации пользователя в Django. Всё работало, но теперь почему-то функции authenticate и login не хешируют принимаемый из формы пароль.
View для авторизации:
def user_login(request):
if request.method == "POST":
    form = Login(request.POST)
    if form.is_valid():
        form_clean = form.cleaned_data
        user_login = form_clean['login']
        user_password = form_clean['password']
        print(user_password)
        user = authenticate(username=user_login, password=user_password)
        if user is not None:
            login(request, user)
            success_text = "Вы успешно вошли в систему."
            return render(request, 'login.html', context={'success':success_text})
        else:
            form = Login()
            err_message = 'Неправильная пара логин/пароль'
            return render(request, 'login.html', context={'login':form, 'err':err_message})
else:
    form = Login()
    return render(request, 'login.html', context={'login':form})


View для регистрации:
def registrate(request):
if request.method == "POST":
    registr_user = Registr(request.POST)
    if registr_user.is_valid():
        user = registr_user.save(commit=False)
        user.set_password(registr_user.cleaned_data['password'])
        user.save()
        login(request, user)
        return HttpResponseRedirect(reverse('main'))
    else:
        registr_user = Registr()
        return render(request, 'registration.html', context={'form':registr_user})
else:
    registr_user = Registr()
    return render(request, 'registration.html', context={'form':registr_user})


Кроме этого на модель пользователя, расширяющую стандартную User, повешены два сигнала:
Первый - при создании нового объекта User, создаю новый объект MyUser:
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
    MyUser.objects.create(user=instance, id=instance.id)

Второй - при смене пароля MyUser, меняю пароль для User:
@receiver(post_save, sender=MyUser)
def change_user_data(sender, instance, **kwargs):
    user = User.objects.get(id = instance.id)
    user.set_password(instance.password)
    user.save()

В итоге авторизация по текстовому паролю работает для админа, и работает для пользователей после смены их паролей через джанговскую админку. Также, до смены пароля пользователей в админке, могу зайти в их аккаунты по хешированному паролю.
Подскажите, в чем может быть дело. Уже третий день не могу решить эту проблему.
  • Вопрос задан
  • 750 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@dimastbk
MyUser.password видимо хранит хешированный пароль (или вы его храните в открытом виде?). И при User.set_password() получается хеш от хеша
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы