티스토리 뷰

django

django / 비밀번호 변경

4567은 소수 2020. 12. 29. 02:58

이번에는 비밀번호 변경을 해보겠습니다. 찾아보니 역시 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함