수학과의 좌충우돌 프로그래밍

[Django]User 비밀번호 변경하기, check_password 본문

웹프로그래밍/Django

[Django]User 비밀번호 변경하기, check_password

ssung.k 2019. 5. 4. 23:22

User password 변경하기

User의 password 를 변경해보도록 하겠습니다.

home.html 에는 password를 변경하러 가는 링크가 있습니다.

<a href="{% url 'account:change_pw' %}">비밀번호 변경</a>

링크를 통해 change_pw.html 에 도착하면

    <div class="container">
        <div class="login_container">
				    <div class="error_message">
                {{error}} # 한 번에 제출 후 오류가 있을 경우 error를 가지고 return
            </div>
            <div class="login_title">
                Change Password
            </div>
            <form method="POST" action="{% url 'account:change_pw' %}" class="login_form">
                {% csrf_token %}

                <div class="login_input_container">
                    <div class="username_form_text">Origin Password</div>
                    <div class="input_container">
                        <input class="login_input" name="origin_password" type="password">
                    </div>

                    <div class="password_form_text"> New Password</div>
                    <div class="input_container">
                        <input class="login_input" name="password1" type="password">
                    </div>
                    <div class="confirm_password_form_text">Confirm Password</div>
                    <div class="input_container">
                        <input class="login_input" name="password2" type="password">
                    </div>
                </div>
                <div class="login_btn_container">
                    <input type="submit" class="login_btn" value="Submit">
                </div>
        </div>
        </form>
    </div>

다음과 같이 원래의 password, 새로운 password, 새로운 password 를 한 번 더 적게 됩니다. 이렇게 제출을 하면 views.py 에서 유효성을 검사합니다.

from django.contrib.auth.hashers import check_password

def change_pw(request):
    context= {}
    if request.method == "POST":
        current_password = request.POST.get("origin_password")
        user = request.user
        if check_password(current_password,user.password):
            new_password = request.POST.get("password1")
            password_confirm = request.POST.get("password2")
            if new_password == password_confirm:
                user.set_password(new_password)
                user.save()
                auth.login(request,user)
                return redirect("account:home")
            else:
                context.update({'error':"새로운 비밀번호를 다시 확인해주세요."})
    else:
        context.update({'error':"현재 비밀번호가 일치하지 않습니다."})

    return render(request, "account/change_pw.html",context)

원래의 비밀번호도 일치하고, 새로운 비밀번호가 둘 다 일치한다면 로그인을 하여 home 으로 redirect 해주고, 아닐 경우에는 각각 상황에 맞게 에러 메세지를 담아 return 해주게 됩니다.

여기서 비밀번호는 저장 되는 순간 hash 암호화 되기 때문에 print로 출력을 확인한다고 해서 알아볼 수 가 없습니다. 암호를 푸는 것 역시 굉장히 힘든 일이죠. 따라서 django 에서는 이를 해결해주기 위한 함수를 제공해줍니다.

from django.contrib.auth.hashers import check_password

위에서 import 했던 check_password 를 통해 파라미터로 오는 두 password를 비교하여 boolean 값을 return 하게 됩니다.

check_password(current_password,user.password)

새로운 password로 설정하기 위해서는 단순 대입이 아닌 set_password 로 갱신시켜줍니다.

user.set_password(new_password)

 

Comments