2012-02-03 14 views
6

पासवर्ड बदलने के लिए मैं auth_views.password_change का उपयोग कर रहा हूं और पासवर्ड रीसेट auth_views.password_reset के लिए उपयोग कर रहा हूं।जब कोई उपयोगकर्ता पासवर्ड बदलता है या पासवर्ड रीसेट करने का अनुरोध करता है तो अधिसूचित कैसे किया जाए?

जब कोई उपयोगकर्ता सफलतापूर्वक अपना पासवर्ड बदलता है तो मुझे कैसे सूचित किया जा सकता है? मुझे पुराने और न ही नए पासवर्ड को जानने की जरूरत नहीं है। बस यह घटना हुई, और किस उपयोगकर्ता के लिए।

इसी प्रकार, जब कोई पासवर्ड रीसेट करने का अनुरोध करता है और जब उन्होंने सफलतापूर्वक रीसेट प्रक्रिया पूरी की है तो मैं अधिसूचित होना चाहता हूं।

क्या मैं उपरोक्त सिग्नल या कुछ सरल पैचिंग के साथ कर सकता हूं? या क्या मुझे ऐसा करने के लिए अपने विचार लिखने की ज़रूरत है?

उत्तर

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

आप पहले से ही उपयोग कर रहे हैं 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])

आप सेट करते हैं post_change_redirect url अपने स्वयं के विचारों में से किसी एक पर रीडायरेक्ट करने के लिए, फिर आप उस दृश्य में जो भी कार्रवाई चाहते हैं उसे अधिसूचना (ईमेल, डेटाबेस अपडेट इत्यादि) भेजने के लिए लें।

आप कर सकते थे भी, आपकी रीडायरेक्ट ध्यान में रखते हुए, बस अपनी सूचना और फिर लौट password_change_done(request[, template_name])

+1

यह काम करेगा। हालांकि, उस यूआरएल पर रीफ्रेश भी कार्रवाई को ट्रिगर करेगा। हाथ से उस यूआरएल को लोड करना भी इसे ट्रिगर करेगा। मैं इन दुर्लभ, लेकिन पासवर्ड परिवर्तन के बारे में गलत तरीके से सूचित करने के संभावित तरीकों से बचूंगा। –

+0

मैं मानता हूं कि यह ट्रिगर होगा। मेरा जवाब ज्यादातर आपके प्रश्न के हिस्से के लिए जा रहा था कि वास्तव में अपना पूरा विचार नहीं लिखना है। यह मौजूदा लोगों पर सिर्फ पिगबैक है। जैसा कि दूसरे उत्तर में सुझाव दिया गया है, आपको इसे वास्तविक फॉर्म सबमिशन हैंडलर के माध्यम से करना होगा। – jdi

4

आप एक कस्टम password_change_form कि आप password_change को पारित लिख सकते हैं। यह फ़ॉर्म django के PasswordChangeForm को आपकी सहेजने की विधि को ओवरराइड करने के लिए पहले बदलाव के बारे में सूचित करेगा और उसके बाद इसके माता-पिता PasswordChangeForm सेव विधि को कॉल करेगा। 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

Django 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. संकेतों का उपयोग करते समय इन घटनाओं पर कब्जा करने की, आप भी घटनाओं जहां प्रणाली एक मौजूदा पासवर्ड एक परिवर्तन के कारण मापदंडों hashing में फिर से इनकोडिंग पर कब्जा होगा, ज्यादातर मामलों में, आप इन घटनाओं को कैप्चर नहीं करना चाहते हैं और सिग्नल के साथ इसे रोकने के लिए कोई स्पष्ट तरीका नहीं है।
  2. आप अपने सभी पासवर्ड-हैंडलिंग फॉर्मों की सेव() विधि में फ़ंक्शन-कॉल जोड़ सकते हैं, लेकिन यह तब मुश्किल हो जाता है जब आप अंतर्निहित व्यवस्थापक परिवर्तन पासवर्ड फ़ॉर्म के साथ ऐसा करना चाहते हैं और आपकी सहायता नहीं करेंगे पासवर्ड परिवर्तन प्रोग्राम के रूप में एक फॉर्म के बाहर किए जाते हैं।

मैं आपको सावधान रहूंगा कि पासवर्ड_changed() में पासवर्ड पैरामीटर वास्तव में उपयोगकर्ता का कच्चा पासवर्ड है। इसे संभालने के दौरान सावधानी बरतें और पूरी तरह से इसे कहीं भी अनएन्क्रिप्टेड/अनछुए स्टोर न करें।

संबंधित मुद्दे

 संबंधित मुद्दे