2015-06-13 7 views
10

मुझे Django उपयोगकर्ताओं को पासवर्ड बदलने के साथ कोई समस्या है - मैंने Django में कुछ उत्पादन साइटें बनाई हैं, केवल एक वर्ष (या 1.8 में) में से कोई भी नहीं, लेकिन मुझे याद नहीं है इससे पहले इस मुद्दे।django उपयोगकर्ता पासवर्ड परिवर्तन के बाद लॉग आउट

सारांश

एक उपयोगकर्ता अपना पासवर्ड बदल जाता है, तो उपयोगकर्ता लॉग आउट है, लेकिन पासवर्ड सफलतापूर्वक बदल जाता है।

विवरण

मैं एक राय यह है कि एक उपयोगकर्ता एक पासवर्ड बदलने के लिए अनुमति देता है, मैं मानक Django रूपों और प्रमाणन ढांचे का उपयोग कर रहा है, और तनाव करने के लिए है: पासवर्ड काम करता है बदल रहा है, यह सिर्फ लॉग उपयोगकर्ता को आउट करें ताकि उन्हें फिर से लॉगिन करना होगा

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

यहाँ मेरे विचार समारोह है:

@login_required 
def user_change_password(request): 
    """Allows a user to change their password""" 

    if request.method == "POST": 
     form = SubscriberPasswordForm(request.POST) 
     if form.is_valid(): 
      try: 
       request.user.set_password(form.cleaned_data['password']) 
       request.user.save() 
      except Exception, err: 
       print "Error changing password: {}".format(err) 
       messages.add_message(request, messages.ERROR, 'The password could not be changed, please try again ' 
                   'later. This admins have been notified of this error.') 
      else: 
       #this outputs True 
       print request.user.is_authenticated() 

       messages.add_message(request, messages.INFO, 'Your password has been changed successfully') 
       return HttpResponseRedirect("/accounts/dashboard/") 
    else: 
     form = SubscriberPasswordForm() 

    return render(request, "accounts/change-password.html", {"form": form}) 

तो पासवर्ड बदल जाता है, उपयोगकर्ता डैशबोर्ड पृष्ठ पर पुनः निर्देशित हो जाता है, @login_required डेकोरेटर फिर उन्हें वापस लॉगिन स्क्रीन पर रीडायरेक्ट।

पासवर्ड का फॉर्म यहां है, हालांकि यह बहुत सरल है।

class SubscriberPasswordForm(forms.Form): 
    password = forms.CharField(widget=forms.PasswordInput) 
    cpassword = forms.CharField(widget=forms.PasswordInput) 

    def clean_cpassword(self): 
     password1 = self.cleaned_data.get("password") 
     password2 = self.cleaned_data.get("cpassword") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError(
       self.error_messages['password_mismatch'], 
       code='password_mismatch', 
      ) 
+0

इस पर विस्तृत डॉक्स देखें:

from django.contrib.auth import update_session_auth_hash def password_change(request): if request.method == 'POST': form = PasswordChangeForm(user=request.user, data=request.POST) if form.is_valid(): form.save() update_session_auth_hash(request, form.user) 

निम्नलिखित क्षेत्रों पोस्ट अनुरोध में प्रदान की जानी चाहिए एक जाना है ओडी चीज; और आपको वैसे भी ऐसा करना चाहिए। इसे डिफ़ॉल्ट रूप से 1.7 –

उत्तर

10

Django 1.7 में पासवर्ड परिवर्तन नया होने के बाद मेरी समझ लॉग हो रही है। इसलिए आपको अपने कोड में उपयोगकर्ता को फिर से लिखने की आवश्यकता होगी जैसा आपने कहा था।

देखें रिलीज नोट्स: https://docs.djangoproject.com/en/1.8/releases/1.7/#django-contrib-auth

यहाँ विशिष्ट टिप्पणी है: "AbstractBaseUser.get_session_auth_hash() विधि जोड़ा गया है और अपने AUTH_USER_MODEL AbstractBaseUser से विरासत हैं, किसी उपयोगकर्ता का पासवर्ड बदल रहा है अब अगर पुराने सत्र को अमान्य कर सत्र प्रमाणीकरण मिडलवेयर सक्षम है। इस नए मिडलवेयर को सक्षम करते समय अपग्रेड विचारों सहित अधिक जानकारी के लिए पासवर्ड परिवर्तन पर सत्र अमान्यता देखें। "

दस्तावेज़ देखें: https://docs.djangoproject.com/en/1.7/topics/auth/default/#session-invalidation-on-password-change

+0

ठीक थैक्स में सक्षम किया गया था - उसे नहीं देखा। मुझे लगता है कि 1.6 वास्तव में इस्तेमाल किया गया अंतिम संस्करण था। – picus

2

Django 1.8 लिए

, बस इतना की तरह set_password के बाद update_session_auth_hash फोन:

from django.contrib.auth import update_session_auth_hash 

request.user.set_password(form.cleaned_data['password']) 
update_session_auth_hash(request, request.user) 
संबंधित मुद्दे