2015-06-13 16 views
10

Tôi đang gặp vấn đề với người dùng Django thay đổi mật khẩu - Tôi đã xây dựng một vài trang web sản xuất ở Django, chỉ trong vòng một năm (hoặc 1.8), nhưng tôi không nhớ vấn đề này trước đây.django người dùng đăng xuất sau khi thay đổi mật khẩu

Tóm tắt

Khi người dùng thay đổi mật khẩu của họ, người dùng được đăng xuất, nhưng mật khẩu được thay đổi thành công.

Chi tiết

tôi có một cái nhìn, cho phép người dùng thay đổi mật khẩu, Tôi đang sử dụng hình thức django tiêu chuẩn và khuôn khổ auth, và căng thẳng: thay đổi các công trình mật khẩu, nó chỉ ghi lại người dùng ra để họ phải đăng nhập lại. Tôi thực sự không nhớ điều này một cách khủng khiếp, tôi muốn người dùng được chuyển hướng đến trang tổng quan của họ bằng bản cập nhật tin nhắn, nếu tôi cần làm lại người dùng trong mã, thì tôi sẽ, dường như có vẻ hơi vụng về.

đây là chức năng quan điểm của tôi:

@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}) 

Vì vậy, các mật khẩu được thay đổi, người dùng được chuyển hướng đến trang bảng điều khiển, các trang trí @login_required sau đó sẽ chuyển hướng họ trở lại màn hình đăng nhập.

Biểu mẫu mật khẩu ở đây, mặc dù nó khá đơn giản.

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

này là đi điều od; và bạn nên làm điều này anyway. Nó được kích hoạt theo mặc định trong 1.7 –

Trả lời

10

hiểu biết của tôi đã được đăng xuất sau khi thay đổi mật khẩu là mới trong Django 1.7. Vì vậy, bạn sẽ cần phải xác thực lại người dùng trong mã của mình như bạn đã nói.

Xem Ghi chú Phát hành: https://docs.djangoproject.com/en/1.8/releases/1.7/#django-contrib-auth

Dưới đây là những lưu ý cụ thể: "The AbstractBaseUser.get_session_auth_hash() phương pháp đã được bổ sung và nếu AUTH_USER_MODEL của bạn được thừa hưởng từ AbstractBaseUser, thay đổi mật khẩu của người dùng hiện nay làm mất hiệu lực phiên cũ nếu SessionAuthenticationMiddleware được kích hoạt. Xem phiên làm mất hiệu lực của phiên trên thay đổi mật khẩu để biết thêm chi tiết bao gồm các cân nhắc nâng cấp khi bật phần mềm trung gian mới này. "

Xem Tài liệu: https://docs.djangoproject.com/en/1.7/topics/auth/default/#session-invalidation-on-password-change

+0

ok thx - không thấy điều đó. Tôi nghĩ rằng 1,6 thực sự là phiên bản cuối cùng tôi đã sử dụng. – picus

2

Đối với Django 1,8

Đơn giản chỉ cần gọi update_session_auth_hash sau set_password như vậy:

from django.contrib.auth import update_session_auth_hash 

request.user.set_password(form.cleaned_data['password']) 
update_session_auth_hash(request, request.user) 
14

Đối với django 1.9:

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) 

Các trường sau đây phải được cung cấp trong yêu cầu POST:

  • old_password
  • new_password1
  • new_password2

Xem tài liệu chi tiết tại https://docs.djangoproject.com/en/1.9/topics/auth/default/#session-invalidation-on-password-change

Các vấn đề liên quan