Django: снять пароль пользователя, но при этом разрешить сброс пароля

Я хочу сбросить/отменить пароли моих пользователей, они должны быть вынуждены использовать "сброс пароля", и установить новый, который проверяется новыми валидаторами паролей.

Я нашел документы Django, так что set_unusable_password() не вариант, так как сброс пароля после этого не разрешен. Я обнаружил, что использование user.password = '' работает - пользователь не может войти, а сброс пароля работает.

Все же, это решение кажется немного неудобным, и я не могу найти никаких реальных источников по этой теме - как это с точки зрения безопасности и т.д.?

По ссылке в документации, которую вы опубликовали, говорится: начиная с Django 2.1 вы должны иметь возможность использовать set_unusable_password и по-прежнему запрашивать сброс пароля.

Смотрите https://docs.djangoproject.com/en/4.0/releases/2.1/#miscellaneous:

User.has_usable_password() и функция is_password_usable() больше не возвращают False, если пароль None или пустая строка, или если пароль использует хэшер, не входящий в настройки PASSWORD_HASHERS. Это недокументированное поведение было регрессией в Django 1.6 и препятствовало пользователям с такими паролями запрашивать сброс пароля. Проведите аудит вашего кода, чтобы убедиться, что ваше использование этих API не опирается на старое поведение.

.

Итак, если вы используете Django <1.6 или >=2.1, вероятно, безопаснее использовать предложенный способ задания пароля "None" (который генерирует "фальшивый" хэш, который никогда не может быть действительным закодированным хэшем).

Для промежуточных версий Django я бы посоветовал убедиться, что вы никогда не позволяете отправлять пустую строку для аутентификации, поскольку я думаю, что потенциально можно войти в систему таким образом.

Вернуться на верх