Django는 인증 기능이 정말 잘 구현되어 있다. 그래서 인증 기능 구현에 크게 시간을 소비할 일이 없다.

어떻게 구현되어있는지 자세히 설명을 보진 못했지만 자동으로 세션ID를 클라이언트 쿠키에 저장하는거 같다

Document : https://docs.djangoproject.com/en/2.2/topics/auth/default/

User

Django에서는 User 객체를 이용하여 계정를 관리한다

superuser 나 staff 도 User 객체에 포함된다

속성으로는 아래와 같이 있다

  • username (required) - 중복 X
  • password (required)
  • email
  • first_name
  • last_name

회원가입

회원가입은 User 모델의 create_user()함수를 이용하면 된다

create_user(username, email=None, password=None, **extra_fields)

from django.contrib.auth.models import User

def signUp(request):
  user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

# 이렇게 인자를 지정해도 된다
def signUp2(request):
  user = User.objects.create_user(username='john', password='johnpassword')

비밀번호를 없이도 가능하고 등등 여러 설정이 있다. 문서를 확인하자

회원정보 수정

from django.contrib.auth.models import User
user = User.objects.get(username='john')
user.first_name='johnny'
user.set_password('new password') # 비밀번호 변경 함수
user.save()

User 같은 모델을 수정한 후에는 꼭 save() 함수를 사용해야 저장된다

인증

인증... 정말 간단하다... 여기서 확실히 Django가 생산성이 있다는게 느껴졌다

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # 인증 성공
else:
    # 인증 실패

Django 에서는 username이 ID로 취급한다

로그인

로그인은 인증 후 login() 함수를 쓰면된다 (너무간단해서 쓸 설명도 없다...)

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # 성공:리다이렉트
        ...
    else:
        # 실패:에러메시지 전송
        ...

request.POST['name'] 이 Form Data를 받는 함수다

로그아웃

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.

인증 확인

인증이 되어야 들어갈 수 있는 페이지나 인증이 필요한 API를 위해서, 인증이 된 계정인지 확인할 필요가 있다

인증확인 실패 Redirect 경로 설정

먼저 인증 확인 실패시 리다이렉트할 경로를 설정해주자
settings.py

...
LOGIN_URL = '/login/'

난 로그인 페이지로 리다이렉트 시키겠다

인증 확인

views.py

from django.conf import settings
from django.shortcuts import redirect

def my_view(request):
    if not request.user.is_authenticated:
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))...

이렇게 settings 를 불러와서 LOGIN_URL로 리다이렉트 시키는 방법이 있다

shortcut

views.py

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

이게 정말... 대박이다
로그인이 필요한 view에 저렇게 붙여주면 아까 settings.py에 설정한 경로로 리다이렉트 된다

from django.contrib.auth.decorators import login_required

@login_required(login_url='/sign-up/')
def my_view(request):
    ...

혹시 제너릭 뷰를 쓴다면 아래처럼 설정하면 된다

from django.utils.decorators import method_decorator

@method_decorator(login_required, name='dispatch')
class IndexView(generic.DetailView):
  ...

이렇게 따로 경로를 설정 할 수 도 있다 👏🏻👏🏻👏🏻