Django Authentication

  • 인증기능은 웹애플리케이션의 필수 기능, 장고가 기본적으로 제공하는 기능 중의 하나.
    장고 패키지에 포함되어 있는 django.contrib.auth 앱이 인증기능을 담당.
  • 장고에서는 User 테이블을 기본으로 제공하고 있음.
    장고 인증을 담당하는 Auth 앱은 User 테이블 이외에도 Group, Permission 등의 테이블을 정의하고 있음.

User 테이블 구조 (Django 기본 제공)

필드명 타입 제약조건, 디폴트 설명
id Integer PK, Auto Increment 기본키
password CharField(128)   비밀번호
username CharField(30) Unique 로그인 이름
first_name CharField(30) Blank 사용자 이름
last_name CharField(30) Blank 사용자 성
email CharField(254) Blank 이메일 주소
is_superuser BooleanField False 슈퍼유저(관리자) 여부
is_staff BooleanField False 스태프 여부
is_active BooleanField True 계정 활성화 여부
date_joined DateTimeField timezone.now 계정 생성 시간
last_login DateTimeField Blank, Null 마지막 로그인 시간

인증 URL (Django 기본 제공)

  • 장고의 인증기능을 보면, URL과 뷰는 이미 개발되어 있고, 템플릿은 템플릿 파일명만 정해져 있으므로, 그 템플릿 내용을 직접 채워넣어줘야 한다.
    (장고에서 기본적으로 제공되는것들이지만, 모두 커스터마이징이 가능함 )
URL 패턴 뷰 이름 템플릿 파일명
/accounts/login/ login() registration/login.html
/accounts/logout/ logout() registration/logged_out.html
/accounts/password_change/ password_change() registratioin/password_change_form.html
/acounts/password_change/done/ password_change_done() registration/password_change_done.html
/accounts/password_reset/ password_reset() registration/password_reset_form.html, registration/password_reset_email.html, registration/password_reset_subject.txt
/accounts/password_reset/done/ password_reset_donne() registration/password_reset_done.html
/accounts/reset/ password_reset_confirm() registration/password_reset_confirm.html
/accounts/reset/done/ password_reset_complete() registration/password_reset_complete.html

Setting.py 수정

LOGIN_URL
로그인 페이지로 리다이렉트시킬때 사용되는 URL.
값을 지정하지 않으면 /accounts/login/ 을 기본 URL로 사용

LOGOUT_URL
로그아웃시킬때 사용되는 URL
값을 지정하지 않으면, /accounts/logout 을 기본 URL로 사용.

LOGIN_REDIRECT_URL
장고의 기분 로그인 뷰인 contrib.auth.login() 뷰는 로그인 처리가 성공한 후에 next 파라미터로 지정한 URL로 리다이렉트시킴.
만일 next 파라미타값이 없다면, 여기에 지정된 값으로 URL로 리다이렉트시킴.

INSTALLED_APPS 부분에 django.contrib.auth 이 포함되어 있는지 확인.
(INSTALLED_APPS에는 장고 실행시 작동되는 앱들이 작성되어 있다.)


URLConf 설정

mysite/urls.py

# 계정등록(Register)처리를 수행하는 뷰를 import  
from mysite.views import UserCreateView, UserCreateDoneTV 
  
urlpatterns = [
   ... 
    # 인증 URL
    path('account/', include('django.contrib.auth.urls')),
    path('account/register/', UserCreateView.as_view(), name='register'),
    path('account/register/done/', UserCreateDoneTV.as_view(), name='register_done'),
]

뷰 작성하기

login() 등의 장고 auth 모듈에서 제공하는 뷰는 따로 코드를 작성할 필요가 없음.
하지만, auth 모듈에 없는 뷰인 회원가입을 담당하는 UserCreateViewUserCreateDoneTV를 작성해주어야 한다.

mysiate/views.py

from django.views.generic.edit import CreateView  #1 제네릭뷰 CreateView import  
from django.contrib.auth.forms import UserCreationForm #2 UserCreateForm import
from django.urls import reverse_lazy

class UserCreateView(CreateView):
    template_name = 'registration/register.html'
    form_class = UserCreationForm
    success_url = reverse_lazy('register_done')


class UserCreateDoneTV(TemplateView):
    template_name = 'registration/register_done.html'

제네릭 뷰 CreateView를 import
이 뷰는 테이블의 레코드를 생성하기 위에 필요한 폼을 보여주고, 폼의 입력을 통해 테이블의 레코드를 생성해주는 역할을 담당.
제네릭 뷰 중에서 테이블 변경 처리에 관련된 뷰를 편집용 제네릭 뷰라고 하는데, CreateView 외에 UpdateView, DeleteView, FormView가 있음.

UserCreateForm import
UserCreateForm은 User 모델 객체를 생성하기 위해 보여주는 폼(장고에서 기본적으로 제공됨. )


템플릿 작성하기

로그인 폼(login.html)

    <form action="." method="post"> {% csrf_token %}
        {% if form.errors %} <!-- 1 -->
        <p class ="errornote"> Wrong! Please correct the error(s) below. </p>
        {% endif %}
        <p> Fill in a form. </p>

        <fieldset class="aligned"> <!-- 2 -->
            <div class="form-row">  <!-- 3 -->
                {{ form.username.label_tag }} {{ form.username }}
            </div>
            <div class="form-row">   
                {{ form.password.label_tag}} {{ form.password }}
            </div>

        </fieldset>
        <div class="submit-row">
            <input type="submit" value="Log In"/>
            <input type="hidden" name="text" value = "{{ next }} "/> <!-- 4 -->
        </div>
    </form>
</div>
  1. 폼에 입력된 내용 중 에러가 있는 경우, ‘Wrong! Please correct the error(s) below.’ 문장이 출력된다.
  2. fieldSet 태그 폼에서 연관된 요소들을 묶어주는 역할을 담당. 예제에서는 Username과 Password를 하나의 항목으로 묶어줌.
  3. Username 입력 요소를 출력.
    form 변수는 login() 뷰에서 넘겨주는 AuthenticationFrom 객체이다.
    AuthenticationForm 폼 클래스도 장고에서 제공해주는 로그인용 기본 폼!
    form.username은 폼 객체의 username 필드를 의미.
    form.username.label_tag 변수는 username 필드의 레이블에 콜론(:)을 붙여준다. 이름 입력창 옆에 Username: 문구를 출력한다.
  4. 폼을 서버에 전송할때, 폼의 next항목에 변수값을 할당한다.
    이 문장에 의해 login() 뷰가 POST 요청을 처리한 후(로그인 성공 후), 변수에 지정된 URL로 이동시켜준다.

회원가입 폼(register.html)

    <form method="post" action="."> {% csrf_token %}
        {% if from.errors %}
        <p> Wrong ! Please correct the error(s) below.</p>
        {% endif %}

        <p> Pleas fill in a form. </p>
        <fieldset class="aligned">
            <div class="form-row">
                {{ form.username.label_tag}} {{ form.username }}
            </div>
            <div class="form-row">
                {{ form.password1.label_tag}} {{ form.password1 }}
            </div>
            <div class="form-row">
                {{ form.password2.label_tag}} {{ form.password2 }}
            </div>
               <div class="form-row">
                {{ form.email.label_tag}} {{ form.email }}
            </div>
        </fieldset>
        <div class ="submit-row">
            <input type="submit" value = "Register" />
        </div>
    </form>

  • register.html의 form 변수는 UserCreationForm 객체이며 , 이것 역시 장고에서 기본적으로 제공되는 폼이다.

가입처리 성공 후 보여지는 페이지(register_done.html)

<div class="content">
    <h2> Registration Completed Successfully. </h2>
    <p><a href="{% url 'login'%}">Log in</a></p>
</div>

전체 프로그램 소스
참조