2012-02-03 2 views
6

비밀번호 변경을 위해 auth_views.password_change을 사용하고 비밀번호 재설정을 위해 auth_views.password_reset을 사용합니다.사용자가 암호를 변경하거나 암호 재설정을 요청할 때 알림을받는 방법?

사용자가 암호를 성공적으로 변경하면 어떻게 알림을받을 수 있습니까? 나는 오래되거나 새로운 암호를 알 필요가 없습니다. 이벤트가 발생했는지 그리고 어떤 사용자인지.

마찬가지로 누군가가 비밀번호 재설정을 요청한 경우 및 재설정 절차를 성공적으로 완료 한 경우에도 알림을 받고 싶습니다.

신호 또는 간단한 패치로 위와 같은 작업을 수행 할 수 있습니까? 아니면 내 자신의 견해를 써야합니까? 이미 auth_views.password_change 뷰에 내장 사용하는 경우 그들이 성공적으로 변경 후 재 지정되면, 자신을 알릴 쉬울 것이다

답변

7

가 장식 만들기 당신의 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)), 
    ... 
) 

이보기에서 직접 이메일을 보내거나이 경우 실내 장식에 요청을 묶어 것이라는 점을 명심하십시오. 직접 전자 메일을 보내는 대신 사용자 지정 신호와 스레드를 실행하여 실제로 전자 메일을 보내는 처리기를 만드는 것이 좋습니다. 그런 다음 데코레이터에서 신호를 보냅니다.

+0

동기 신호가 동기? 메일이 비동기식 프로세스에서 발생하지 않는다면 똑같지 않을까요? – jdi

+1

따라서 "스레드 끄기"비트. 신호로 전자 메일을 보내기위한 스레드를 만들면 실제로 비동기가됩니다. 신호가 처리를 반환하고 새로운 스레드가 행복하게 이메일 전송 프로세스를 진행합니다. –

+0

아, 그 작은 비트가 그리워졌습니다. 신호에만 초점을 맞 춥니 다. – jdi

2

:

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])

당신이 설정 한 경우 post_change_redirect 자신의보기 중 하나로 리디렉션 할 URL을 지정하면 해당보기에서 원하는 모든 작업 (예 : 전자 메일, 데이터베이스 업데이트 등)을 전송하기 만하면됩니다.

당신 수도, 당신의 리디렉션보기에서 바로 알림을 다음 password_change_done(request[, template_name])

+1

이렇게하면됩니다. 그러나 해당 URL을 새로 고침해도 작업이 트리거됩니다. URL을 직접 손으로로드하는 경우에도 해당 URL이 실행됩니다. 차라리 암호 변경을 알리는 이러한 드물지만 잠재적 인 방법을 피하고 싶습니다. –

+0

방아쇠를 당길 것에 동의합니다. 내 답변은 대부분 자신의 전체보기를 작성하지 않아도된다는 질문에 대한 것이 었습니다. 이것은 기존의 것들을 피기 백합니다. 다른 대답에서 제안 된 것처럼 실제 양식 제출 처리기를 통해이 작업을 수행해야합니다. – jdi

4

당신은 당신이 password_change에 전달 사용자 정의 password_change_form를 작성할 수 반환합니다. 이 양식은 django의 PasswordChangeForm의 save 메소드를 재정의하여 변경 사실을 먼저 알린 다음 부모 PasswordChangeForm의 save 메소드를 호출하도록 확장합니다. password_change보기에

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

문서 : PasswordChangeForm에 대한 https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.forms.PasswordChangeForm

코드 : 그냥 그런

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

: https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/forms.py

1

신호를 캡처하여 암호가 변경되었는지 확인할 수도 있습니다. 이 코드는 사용자가 변경 될 때마다 실행된다는 점을 명심하십시오.

@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 
+0

관리자가 암호 해시 매개 변수를 변경하면이 신호 처리기가 다음에 로그인 할 때 모든 사용자에 대해 호출됩니다.이 신호 처리기를 사용하여 암호 만료 정책을 적용하려는 경우 중요합니다 . – mkoistinen

2

장고 1.9부터 고유 한 암호 유효성 검사기를 정의 할 수 있습니다. 원하는 경우 기존의 것을 다시 정의 할 수도 있습니다.당신이 방법을 추가 할 때 : 지금

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

, 암호는 사용자가 변경 될 때마다, 수업 MyPasswordValidator 다음과 같이

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

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

설정에서 새 클래스를 포함해야합니다 통보됩니다. 내 경험에 의하면, 문제는이 때문에 할 수있는 가장 좋은 방법입니다 :

  1. 이러한 이벤트를 캡처하는 신호를 사용하여, 당신은 또한 시스템 매개 변수를 해싱에 의한 변화로 기존의 암호를 다시 인코딩 이벤트를 캡처합니다, 대부분의 경우 이러한 이벤트를 포착하고 싶지 않으며 신호로 막을 수있는 확실한 방법이 없습니다.
  2. 모든 비밀번호 처리 양식의 save() 메소드에서 function-call을 간단하게 추가 할 수 있지만 내장 된 관리자 변경 비밀번호 양식을 사용하여 동일하게 수행하려는 경우 어려워집니다. 암호 변경은 양식 외부에서 프로그래밍 방식으로 수행됩니다.

password_changed()의 password 매개 변수는 실제로 사용자의 원시 비밀번호입니다. 이것을 처리 할 때는주의를 기울여야하며 암호화되지 않은/해시되지 않은 곳에서는 절대 저장하지 마십시오.

관련 문제