Zaczynając od Django 1.9, możesz zdefiniować swój własny walidator haseł. Możesz nawet po prostu ponownie zdefiniować istniejący, jeśli chcesz.Gdy to zrobisz, dodać metodę:
from django.contrib.auth.password_validation import MinimumLengthValidator
class MyPasswordValidator(MinimumLengthValidator):
def password_changed(self, password, user):
# put your password changed logic here
Pamiętaj, aby podać swoją nową klasę w ustawieniach następująco:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'my_package.password_validators.MyPasswordValidator',
'OPTIONS': {
'min_length': 8,
}
},
...
]
Teraz, za każdym razem hasło zostało zmienione przez użytkownika, klasa MyPasswordValidator zostanie powiadomiony. W moim doświadczeniu, jest to najlepszy sposób, aby to zrobić, ponieważ:
- Przy użyciu sygnałów, aby uchwycić te zdarzenia, będzie również przechwytywać zdarzenia, gdzie system ponownie kodowane istniejącego hasła z powodu zmian w mieszania parametrów, w większości przypadków nie chcesz przechwytywać tych zdarzeń i nie ma oczywistego sposobu, aby temu zapobiec za pomocą sygnałów.
- Możesz łatwo dodać wywołanie funkcji w metodzie save() wszystkich formularzy obsługi haseł, ale to staje się trudne, gdy chcesz zrobić to samo z wbudowanym formularzem zmiany hasła administratora i nie pomoże, jeśli zmiany hasła dokonywane są programowo poza formularzem.
Będę ostrzegać, aby mieć świadomość, że parametr password w password_changed() jest w rzeczywistości nieprzetworzonym hasłem użytkownika. Zachowaj ostrożność podczas obchodzenia się z tym i absolutnie nigdy nie przechowuj tego w żadnym miejscu niezaszyfrowanym/nierozpakowanym.
Arent sygnały synchroniczne mimo? Chyba, że mail odbywa się w procesie asynchronicznym, czy to nie to samo? – jdi
Stąd bit "odpalić nitkę". Jeśli utworzysz wątek, który wyśle wiadomość e-mail w sygnale, wówczas stanie się on asynchroniczny. Sygnał zwraca przetwarzanie, a nowy wątek szczęśliwie przechodzi proces wysyłania wiadomości e-mail. –
Ah tęsknię za tym trochę. Skoncentruję się na sygnałach – jdi