티스토리 뷰

Django Autentication(인증)

대부분의 웹사이트에서는 현재 접속한 사용자가 로그인을 했는지, 로그인을 했다면 어떤 사용자이고 어떤 권한을 가지

 

고 있는지에 따라 사용할 수 있는 기능이나 페이지에 제한을 두고 있습니다. 이와 같은 로직을 구현하기 위해서는 먼저

 

사용자를 인증하는 과정을 거쳐야 합니다. Django에서는 이런 사용자 인증 및 권한 승인 시스템을 다양한 기능들과 함

 

께 제공하고 있습니다.

 


User

Django에서는 User 객체를 이용하여 계정를 관리하며 User 속성으로는 아래와 같다.

  • username (required) - like ID
  • password (required)
  • email
  • first_name
  • last_name

 

1. User 생성 - 회원 가입

  • create_user(username, email=None, password=None, **extra_fields)
from django.contrib.auth.models import User

def signUp(request):
    # 방법 1  
    user = User.objects.create_user('abc', 'abc@abc.com', 'password')
    # 방법 2
      user = User.objects.create_user(username='abc', email='abc@abc.com', password='password')
  • 비밀번호는 해시되어 데이터베이스에 저장된다.

처음에 admin 페이지에 접속하기 위해 createsuperuser 명령을 날려 슈퍼 유저를 생성한 것처럼 다음 함수로 슈퍼 유저

 

를 생성할 수 있다.

  • create_superuser(username, email, password, **extra_fields)

    : 기본적으로 create_user() 와 비슷하나 is_staffis_superuser 속성이 True로 설정된다.

from django.contrib.auth.models import User

def createSuperUser(request):
    superUser = create_superuser('abc', 'abc@abc.com', 'password')

 

2. User 정보 수정

from django.contrib.auth.models import User
user = User.objects.get(username='abc')
user.email='123@abc.com'
user.set_password('new password')     # 비밀번호 변경

user.save()        # 수정 후 save()를 해야 영구적으로 반영됨
  • 비밀번호가 변경되면 모든 세션이 로그아웃된다.

 

3. User 인증 및 로그인

  • authenticate(request=None, **credentials)

    : User 인증 함수. 자격 증명이 유효한 경우 User 객체를, 그렇지 않은 경우 None을 반환

  • login(request, user, backend=None)

    : 로그인 함수. Django의 세션 프레임 워크를 사용하여 세션에 인증된 사용자의 ID를 저장

from django.contrib.auth import authenticate, login

def login(request):
    username = request.POST['username']
    password = request.POST['password']
    # username과 password로 자격 증명
    user = authenticate(request, username=username, password=password)

    if user is not None:
        login(request, user)
        # 로그인 성공
        ...
    else:
        # 로그인 실패
        ...

 

4. 인증 확인

로그인인한 사용자만 사용할 수 있는 페이지나 기능 등을 위해 현재 사용자가 인증되어 있는지 확인해야 한다.

 

먼저, 인증 실패시 리다이렉트할 경로를 지정한다.

# settings.py
...
LOGIN_URL = '/login/'
...

 

4.1 View에서의 인증 확인

Django는 세션과 미들웨어를 사용하여 인증 시스템을 요청 객체에 연결한다. 그 후 모든 Request에 현재 사용자를 나타

 

내는 request.user 속성을 제공한다. 현재 사용자가 로그인한 경우 User 객체를, 로그인 하지 않은 경우 AnonymousUser

 

객체로 설정된다.

  • is_authenticated : 대상 User 객체의 로그인 여부를 확인
def example(request):
    if request.user.is_authenticated:
        # 로그인한 유저인 경우
        ...
    else:
        # 로그인 하지 않은 유저인 경우
        ...
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
  • '%s?next=%s' : 기본적으로 인증 성공시 사용자를 리다이렉트하는 경로는 "next"라는 쿼리 문자열 매개 변수에  저장

 

login_required() 데코레이터를 사용하면 로그인하지 않은 유저에 대한 처리를 위의 방법보다 더 간단하게 구현할 수 있다.

  • login_required(redirect_field_name='next', login_url=None)

    : 지정된 인자값이 없을 경우, settings.py에 설정한 LOGIN_URL 로 리다이렉트

from django.contrib.auth.decorators import login_required

@login_required
def example1(request):
    ...

@login_required(redirect_field_name='login')
def example2(request):
    ...

@login_required(login_url='/accounts/login/')
def example3(request):
    ...    

 

4.2 Template에서의 인증 확인

...
{% if user.is_authenticated %}
    <a href="{% url 'login:signout' %}">로그아웃</a>
{% else %}
    <a href="{% url 'login:signin' %}">로그인</a>
{% endif %}
...

 

5. 로그아웃

  • logout(request) : 현재 request에 대한 세션 데이터를 모두 삭제
from django.contrib.auth import logout

def logout(request):
    logout(request)

 


 

참고 자료

 

Django Autentication(인증)

웹사이트의 기본인 인증. Django로 쉽게 할수 있다

velog.io

 

 

[Django] 사용자 인증 시스템 (2)

[Django] 사용자 인증 (2) Using the Django authentication system 이 문서는 Django의 인증 시스템을 기본 구성에서 사용하는 방법을 설명한다. 이 구성은 가장 일반적인 프로젝트 요구에 부응하고, 상당히 광범..

itinerant.tistory.com

 

Using the Django authentication system | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

댓글