Meme's IT

[Django] 로그인(3) 비밀번호 바꾸기 본문

BackEnd/Django

[Django] 로그인(3) 비밀번호 바꾸기

Memez 2023. 10. 5. 16:55

2023.10.05 - [Django] - [Django] 로그인(2) 가입/탈퇴/수정

 

[Django] 로그인(2) 가입/탈퇴/수정

2023.10.04 - [Django] - [Django] 로그인(1) 로그인, 로그아웃 [Django] 로그인(1) 로그인, 로그아웃 # Django Authentication System 사용자 인증과 관련된 기능을 모아 놓은 시스템 이 기능을 통해, 로그인 / 로그아

memezz.tistory.com

과 이어집니다.


회원정보 수정을 해보면, 비밀번호를 바꾸는 항목이 따로 없고

다음과 같이 바꾸려면 링크를 클릭해서 바꾸라고 함

그래서 그 링크를 들어가보면

서버주소 / 숫자 / password / 의 URL으로 연결되고 없는 페이지라고 함

 

→ 비밀번호 수정을 위해 해당 페이지를 만들어주면 된다

 

 

# 비밀번호 변경시키기

비밀번호 변경 =  인증된 사용자의 Session 데이터를 Update

 

이전 페이지의 URL에서 가운데 있는 숫자는 user의 pk이다.

그리고, 주소에서 account가 없으므로 url을 account/urls.py의 위치가 아니라

프로젝트의 urls.py에 작성해줘야 한다.

# project/urls.py

from accounts import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
    path('accounts/', include('accounts.urls')),
    path('<int:user_pk>/password/',views.change_password,name="change_password")	# 추가
]

 

change_password함수는 accounts/views.py에 작성해준다.

여기서, 비밀번호 변경 시

사용자의 입력 데이터를 받는 built - in Form인 PasswordChangeForm을 사용

# accounts/views.py

from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm

def change_password(request, user_pk):
    if request.method == "POST":
        if form.is_valid():
            form = PasswordChangeForm(request.user, request.POST)	# 바꿔주고
            user = form.save()	# 저장
            return redirect('article:index')
    else:
        form = PasswordChangeForm(request.user)
    context = {
        'form':form
    }
    return render(request,'accounts/change_password.html', context)

Template/accounts/ 위치에 change_password.html 파일 생성 및 작성

<h1>비밀변호 변경</h1>
<form action="{% url "change_password" user.pk %}" method="POST">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="수정하기">
</form>

 

이후, 다시 이전의 비밀번호 변경 url으로 들어가면 확인할 수 있다.

 

근데, 비밀번호를 변경하면 기존 세션과 회원 인증 정보가 일치하지 않음

→ 로그아웃 처리가 되버림..

 

그러한 세션 무효화를 막아주기 위해 update_session_auth_hash(request, user) 함수를 이용한다.

이 함수는 암호가 변경되면 새로운 password의 Session Data로 기존 Session을 자동으로 갱신해 줌

# accounts/views.py 추가
from django.contrib.auth import update_session_auth_hash

def change_password(request, user_pk):
    if request.method == "POST":
        if form.is_valid():
            form = PasswordChangeForm(request.user, request.POST)
            user = form.save()
            update_session_auth_hash(request, user)	# 추가해줌
            return redirect('article:index')