※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
Web 어플리테이션을 만들 때, 유저의 권한에 따라 액세스 할 수 있는 페이지나 페이지 안에서 표시되는 항목을 제한하고 싶은 경우가 있다. 예를 들면, 관리자만 접근할 수 있는 페이지의 생성이나 일반 회원과 프리미엄 회원의 화면에 표시되는 항목 차이등 말이다.
이러한 액세스 제어를 Django에서 만든 Web 어플리케이션에서 구현하기 위해서는 기본적으로 제공되는 "인증 기능"을 사용하면 간단하게 가능하다. 이번 포스트에서는 Django의 인증 기능을 쓴, 유저별 액세스 제한을 구현하는 방법에 대해 알아보도록 하겠다. 참고로 Django의 인증기능에 대해서는 Django 공식 페이지에서 확인해보길 바란다.
Django에는 그 외에 유저나 그룹 마다 모델 추가, 변경, 삭제의 상세한 권한을 설정하여 동일한 액세스 제한을 구현할 수 있지만, 그런 방법에 대해서는 이번 포스트에서는 다루지 않도록 하겠다.
또한 이 방법 외에도 Django에는 액세스 제어를 위한 방법이 몇 가지 있지만, 이번에는 기본적으로 Django에서 제공하는 "인증기능"만 설명하도록 하겠다.
로그인 인증 구조
앞서 말했듯, Django에는 "인증기능"이 제공된다. 로그인 인증에 사용하는 패키지는 다음과 같다.
django.contrib.auth
설정 파일 settings.py를 보면, 위 패키지를 사용할 수 있도록 맨 처음에 INSTALLED_APPS에 기재되어 있다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
로그인 인증에 사용하는 모델은 다음의 세 가지이다.
- django.contrib.auth.models.User
- django.contrib.auth.models.Permission
- django.contrib.auth.models.Group
생성한 유저 정보는 위의 User 모델에 저장된다. 「python manage.py createsuperuser」으로 생성된 슈퍼 유저도 User 모델에 저장된다.
유저의 종류
유저에는 아래 세 가지 종류가 있다.
- 슈퍼 유저
- 스탭 유저
- 액티브 유저
각각의 유저는 권한이 다르다.
슈퍼 유저는 모든 권한이 부여된다. 그러므로 모든 유저에 이 권한을 부여하는 것이 아닌, 관리자 몇 명에게만 부여해야 할 권한이다.
스탭 유저는 관리(admin) 화면에 로그인할 수 있게 된다. Web어플리케이션에서는 엔드 유저에는 이 권한을 부여하지 않고, Web 어플리케이션을 운영하고 있는 스탭에 이 권한을 부여한다.
액티브 유저는 Django로 구현된 Web 어플리케이션의 유저로써 인식될지 아닌지를 판별한다. 예를 들어 퇴직한 스탭이나, 회원 탈퇴한 고객은 액티브 유저에서 제외되어 로그인할 수 없게 된다.
이러한 세 가지 유저 권한을 이용해, 페이지 액세스 제어나 표시 제한을 해보자.
유저 권한 설정 방법
유저 권한(슈퍼, 스탭, 액티브)의 설정은 관리하면에서 실시한다. 관리 화면의 톱에서 Users를 클릭하고, 대상 유저를 선택한다.
대상 유저를 선택하면 "Change User"화면 이동하게 된다. 여기서 "Permissions"에서 Active Staff, Superuser의 권한을 부여, 삭제할 수 있다.
로그인 유저 정보 얻기
로그인으로 인증된 유저의 각 정보는 아래의 속성을 이용하여 취득할 수 있다. 물론 모델을 커스터마이즈한 경우는 이 표와 다를 수 있다.
속성 | 내용 |
id | 유저 ID |
username | 유저명 |
password | 패스워드(배쉬값) |
is_active | 액티브 유저(True or False) |
is_staff | 스탭 유저(True or False) |
is_superuser | 슈퍼 유저(True or False) |
first_name | 이름 |
last_name | 성 |
이메일 주소 | |
last_login | 마지막 로그인 시간 |
data_joined | 등록일 |
인증한 유저에 대해서 속성을 붙이면 해당하는 정보를 얻을 수 있다. 예를 들면 다음과 같다.
# views.py
def user_information(request):
print(request.user.username)
# test
print(request.user.email)
# test@yahoo.co.jp
print(request.user.is_active)
# True
print(request.user.is_staff)
# False
print(request.user.is_superuser)
# False
표시제한
로그인한 유저인지 판단
템플릿(html파일)에 애초에 유저가 로그인하고 있는가를 판단하기 위해서는 is_authenticated속성을 사용한다.
{% if user.is_authenticated %}
로그인하고 있는 경우에 표시되는 내용을 기재
{% endif %}
템플릿 내에서 유저 권한마다 표시 항목을 제한하기
템플릿(html파일)에 유저 권한에 따라 표시하거나 표시되지 않는 것을 제어할 수 있다.
{% if user.is_superuser %}
<ul>
<li><a href="" class=" ">Admin Site</a></li>
</ul>
{% endif %}
위와 같이 작성하면 <ul>문은 로그인 유저가 슈퍼 유저일 때만 표시된다.
액세스 제한
view.py에서 유저 권한에 따라 판단하기
request.user.is_superuser등으로 유저 권한을 확인하며 if로 판정하는 것으로 액세스 제한을 구현할 수 있다.
if not request.user.is_superuser:
return redirect(리다이렉트할 곳을 지정)
위 코드에서는 유저 권한이 슈퍼 유저가 아니면 리다이렉트된다. 이러한 제한에 의해 페이지에 액세스할 수 없게 된다.
그 외에 is_authenticated을 사용하면, 로그인 유저만 액세스할 수 있도록 제한하는 것도 가능하다.
if not request.user.is_authenticated:
return redirect(리다이렉트할 곳을 지정)
위 코드는 로그인한 유저가 아니면 지정된 페이지로 리다이렉트된다.
참고자료
https://office54.net/python/django/django-access-limit
'IT > WEB' 카테고리의 다른 글
[Django] 페이지네이션(페이징) (0) | 2022.07.09 |
---|---|
[Django] Form의 cleaned_data 그리고 is_valid()시 호출되는 메소드의 순서 (0) | 2022.07.03 |
[Django] 클래스 베이스 뷰(Class Based View), 함수 베이스 뷰(Function Based View) (0) | 2022.07.01 |
[Django] User모델 커스터마이즈하기 (커스텀 User 모델) (0) | 2022.06.29 |
[Django] Django 개발을 시작할 때, 최적의 프로젝트 디렉토리 구성 (0) | 2022.06.17 |