티스토리 뷰
이번에는 비밀번호 변경을 해보겠습니다. 찾아보니 역시 django답게 비밀번호를 변경하는 form이 존재했습니다. 하지만 이 form은 비밀번호 8자리 이상 등 귀찮은 조건을 갖추고 있습니다.
그렇기에 form을 이용한 것과 직접 함수를 짠 것 2가지로 해보겠습니다.
1. form 이용
비밀번호 변경을 위한 app의 views.py의 module import 부분에 다음을 추가합니다.
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages
그리고 함수는 아래와 같습니다.
def change_password(request):
if request.method == "POST":
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user)
messages.success(request, 'Password successfully changed')
return redirect('profile')
else:
messages.error(request, 'Password not changed')
else:
form = PasswordChangeForm(request.user)
return render(request, 'change_password.html',{'form':form})
PasswordChangeForm을 이용해 비밀번호를 바꾸겠습니다. 암호화는 django에서 sha256를 이용해 진행하기에 해쉬값을 가집니다. 그렇기 때문에 update_session_auth_hash를 이용해 비밀번호의 hash값을 바꾸도록 합니다.
그리고 비밀번호 변경을 위한 url을 설정하고
path('change_password/',views.change_password, name="re_password")
template에는 다음과 같이 추가합니다.
<form method="POST">
{% csrf_token %}
{{form}}
<button type="submit">비밀번호 변경</button>
</form>
이러면 끝입니다! 결과를 보면 다음과 같습니다.
비밀번호를 바꾸기 위한 조건이 아주 많습니다. 그렇기에 좀 더 간단한 비밀번호를 설정할 수 있도록 해보겠습니다.
(실제 비밀번호는 복잡한 것이 좋지만 지금은 테스트용으로 만들기에 간단한 코드를 작성하겠습니다.)
views.py는 다음과 같습니다.
from django.contrib.auth.hashers import check_password
from django.contrib import messages, auth
def change_password(request):
if request.method == "POST":
user = request.user
origin_password = request.POST["origin_password"]
if check_password(origin_password, user.password):
new_password = request.POST["new_password"]
confirm_password = request.POST["confirm_password"]
if new_password == confirm_password:
user.set_password(new_password)
user.save()
auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend')
return redirect('profile')
else:
messages.error(request, 'Password not same')
else:
messages.error(request, 'Password not correct')
return render(request, 'change_password.html')
else:
return render(request, 'change_password.html')
기존의 비밀번호를 check_password를 이용해 맞는지 확인 후 새로 입력 받은 비밀번호 2개가 일치하는지 검사합니다.
그리고 기존의 회원가입과 유사한 방법으로 진행합니다.
user.set_password를 이용해 새로운 비밀번호를 설정한 뒤, 저장후 로그인을 시킵니다.
(backend = ....) 부분은 소셜로그인으로 인해 backend에 user 정보가 겹쳐져서 추가한 코드이므로 무시하셔도 괜찮습니다.
이 로직에 따라서 html을 다음과 같이 간단히 작성했습니다.
<div class="container">
<form method="POST" action="{% url 're_password' %}">
{% csrf_token %}
현재 비밀번호 :
<input name="origin_password" type="password">
<br><br>
변경할 비밀번호 :
<input name="new_password" type="password">
<br><br>
비밀번호 확인 :
<input name="confirm_password" type="password">
<br><br>
<input class="btn btn-primary" type="submit" value="변경">
</form>
</div>
결과는 다음과 같습니다.
'django' 카테고리의 다른 글
django / 게시글 정렬 구현 (0) | 2021.01.03 |
---|---|
django / multiple authentication backends 에러 처리 (1) | 2020.12.29 |
django / 소셜 로그인 구현 (0) | 2020.12.29 |
django / 댓글 기능 구현 (0) | 2020.12.25 |
django / 글 수정, 삭제 (0) | 2020.12.25 |