Как получить уведомление, когда пользователь меняет пароль или запрашивает сброс пароля? - PullRequest
7 голосов
/ 03 февраля 2012

Для смены пароля я использую auth_views.password_change и для сброса пароля auth_views.password_reset.

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

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

Ответы [ 5 ]

7 голосов
/ 03 февраля 2012

Создать декоратор:

def notify_admins(func):
    def wrapper(request, *args, **kwargs):
        # send email to admins
        return func(request, *args, **kwargs)
    return wrapper

Затем просто добавьте обертку вокруг соответствующих представлений в вашем urls.py:

.
urlpatterns = patterns('',
    ...
    (r'^password_change/done/$', notify_admins(auth_views.password_change_done)),
    (r'^password_reset/done/$', notify_admins(auth_views.password_reset_done)),
    (r'^reset/done/$', notify_admins(auth_views.password_reset_complete)),
    ...
)

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

4 голосов
/ 03 февраля 2012

Вы можете написать пользовательский password_change_form, который вы передадите password_change.Эта форма расширила бы PasswordChangeForm, переопределяя django его метод сохранения, чтобы сначала уведомить вас об изменении, а затем вызвать его метод сохранения PasswordChangeForm s.* Документы на ChangeForm: https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.forms.PasswordChangeForm

Код для PasswordChangeForm: https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/forms.py

3 голосов
/ 18 января 2017

Начиная с Django 1.9, вы можете определить свои собственные средства проверки пароля. Вы можете даже просто переопределить существующий, если хотите. Когда вы это сделаете, добавьте метод:

from django.contrib.auth.password_validation import MinimumLengthValidator
class MyPasswordValidator(MinimumLengthValidator):

    def password_changed(self, password, user):
        # put your password changed logic here

Убедитесь, что ваш новый класс включен в ваши настройки следующим образом:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'my_package.password_validators.MyPasswordValidator',
        'OPTIONS': {
            'min_length': 8,
        }
    },
    ...
]

Теперь, каждый раз, когда пользователь меняет пароль, ваш класс MyPasswordValidator будет уведомляться. По моему опыту, это лучший способ сделать это, потому что:

  1. При использовании сигналов для захвата этих событий вы также будете захватывать события, когда система перекодирует существующий пароль из-за изменения параметров хеширования, в большинстве случаев вам не захочется захватывать эти события, и нет очевидного способа чтобы предотвратить это с помощью сигналов.
  2. Вы можете просто добавить вызов функции в методе save () всех ваших форм обработки паролей, но это становится трудным, если вы хотите сделать то же самое со встроенной формой смены пароля администратора, и не поможет вам, если изменения пароля производятся программно вне формы.

Я предупреждаю вас, что вам нужно знать, что параметр пароля в password_changed () фактически является необработанным паролем пользователя. Будьте осторожны при обращении с этим и абсолютно никогда не храните это нигде в незашифрованном виде.

2 голосов
/ 03 февраля 2012

Если вы уже используете встроенный вид auth_views.password_change, то вам будет легко уведомить себя, как только они будут перенаправлены после успешного изменения:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.password_change

password_change(request[, template_name, post_change_redirect, password_change_form])

Если вы установили URL-адрес post_change_redirect для перенаправления на одно из ваших собственных представлений, то вы просто предпримете любое действие в этом представлении, чтобы отправить уведомление (электронная почта, обновления базы данных и т. Д.).

Вы могли бы даже при просмотре перенаправления просто сделать свое уведомление и затем вернуть password_change_done(request[, template_name])

1 голос
/ 25 сентября 2015

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

@receiver(pre_save, sender=User)
def record_password_change(sender, **kwargs):
    user = kwargs.get('instance', None)
    if user:
        new_password = user.password
        try:
            old_password = User.objects.get(pk=user.pk).password
        except User.DoesNotExist:
            old_password = None

        if new_password != old_password:
            # do what you need here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...