2020-03-25

Django 05. 사용권한 Decorator 구현

Python Decorator 기능으로 프로젝트 각 앱의 권한을 설정하는 함수를 구현합니다.


1. decorators.py 생성

각 앱마다의 사용권한, 예를 들어 공지사항 게시판의 글작성은 관리자 권한의 사용자만, 시험시간표와 같은 기능은 컴퓨터공학부 사용자만 이용할 수 있도록 구현하기 위해 Python에서 제공하는 Decorator 기능을 사용하겠습니다.

users app 내에 decorators.py라는 파일을 생성해주고 아래의 소스를 입력합니다

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
32
33
34
# users/decorators.py

from django.conf import settings
from django.shortcuts import redirect
from django.contrib import messages
from .models import User
from django.http import HttpResponse

# 로그인 확인
def login_message_required(function):
def wrap(request, *args, **kwargs):
if not request.user.is_authenticated:
messages.info(request, "로그인한 사용자만 이용할 수 있습니다.")
return redirect(settings.LOGIN_URL)
return function(request, *args, **kwargs)
return wrap

# 관리자 권한 확인
def admin_required(function):
def wrap(request, *args, **kwargs):
if request.user.level == '1' or request.user.level == '0':
return function(request, *args, **kwargs)
messages.info(request, "접근 권한이 없습니다.")
return redirect('/users/main/')
return wrap

# 비로그인 확인
def logout_message_required(function):
def wrap(request, *args, **kwargs):
if request.user.is_authenticated:
messages.info(request, "접속중인 사용자입니다.")
return redirect('/users/main/')
return function(request, *args, **kwargs)
return wrap

login_message_required

게시판 글작성 등과 같이 로그인한 사용자에게만 권한을 주기 위해 django에서 제공하는 Authentication System인 is_authenticated로 현재 사용자가 로그인 중인지 확인합니다.

(django는 기본적으로 사용자의 접속여부를 판별하는 @login_required를 django.contrib.auth.decorators에서 제공하고있습니다.) Django Authentication 공식문서

request.user로 현재 사용자의 접속상태를 확인하고 비로그인시 django의 message framework 기능을 사용하여 쿠키값에 로그인이 필요하다는 메세지를 담아 이전 포스트에서 설정한 settings.py의 login 경로로 redirect시킵니다. 이 message는 1회성으로 사용자에게 경고창, 확인창 등을 표시할때 유용하게 사용됩니다.

admin_required

공지사항 글작성, 타 게시판 글삭제, 댓글삭제, 학사일정과 같은 기능을 사용할 수 있는 권한을 설정하기 위해 model 생성 부분에서 지정한 사용자의 level 필드를 비교하고 관리자 권한의 사용자가 아닐시 접근 불가 메세지와 함께 나중에 생성할 main 경로로 redirect 시킵니다.

logout_message_required

이미 로그인한 사용자의 회원가입, 로그인을 막기 위해 is_authenticated로 접속중인 사용자를 판별합니다.

2. decorator 적용

위에서 구현한 decorator를 적용하는 방법은 아래와 같습니다.

FBV (Fuction Based View)

1
2
3
4
5
from users.decorators import *

@login_message_required
def example_def(request):
pass

CBV (Class Based View)

1
2
3
4
5
6
from users.decorators import *
from django.utils.decorators import method_decorator

@method_decorator(logout_message_required, name='dispatch')
class ExampleClass(View):
pass

Django 내장 login_required 사용

decorator를 따로 구현할 필요가 없는 경우 django에서 기본으로 제공하는 login_required를 사용할 때는 아래의 import만 추가하면 됩니다. 사용방법은 위와 동일합니다.

1
from django.contrib.auth.decorators import login_required