password_validation.password_changed
не делает то, что вы думаете.
Фактическая проверка пароля выполняется перед сохранением объекта User путем вызова метода django.contrib.auth.password_validation.validate_password
. Этот метод вызывает каждый валидатор в ваших настройках AUTH_PASSWORD_VALIDATORS
и вызывает исключение при сбое любого из этих валидаторов. Это может быть любой вид проверки, например, достаточно ли сложен новый пароль или достаточно ли он отличается от имени пользователя.
В соответствии с документами :
По умолчанию валидаторы используются в формах для сброса или изменения паролей, а также в командах createuperuser и changepassword.
Валидаторы не применяются на уровне модели, например, в User.objects.create_user () и create_superuser (), потому что мы предполагаем, что разработчики, а не пользователи, взаимодействуют с Django на этом уровне, а также потому, что модельпроверка не запускается автоматически как часть создания моделей.
Итак, модель сохранения пользователя не проверяет пароль пользователя, а формы и команды. Если вы вручную устанавливаете пароль в коде где-то, убедитесь, что вы делаете эту проверку самостоятельно.
Так что же делает password_validation.password_changed(self._password, self)
?
Проще говоря, это информируетвсе активные валидаторы, что пользователь изменил свой пароль, вместе с действительным raw новым паролем. Почему это необходимо? Предположим, я пишу валидатор, который проверяет, пытается ли пользователь изменить свой пароль на пароль, который он использовал ранее. Этот валидатор должен знать, какие пароли были у пользователя в прошлом, поэтому мне нужно сохранить список (хешированных) оригинальных паролей для каждого пользователя.
password_changed
- это в основном способ для Djangoскажем всем валидаторам паролей: "Эй, обратите внимание, пароль пользователя был изменен на это значение, поэтому, если вам нужно по какой-то причине отслеживать его, сделайте это сейчас, потому что после этого я уничтожунепроизведенная версия этого пароля "