[Django] Django 인증 및 권한 시스템 - permission_classes
Django 인증 및 권한 시스템
Django는 강력한 인증 및 권한 시스템을 제공함
이를 통해 애플리케이션에서 사용자의 인증 및 권한을 관리할 수 있다.
permission_classes 데코레이터
Django REST framework은 'permission_classes' 라는 데코레이터를 사용하여,
뷰에서 요청을 처리하기 전에 요청에 대한 인증 및 권한 확인을 수행함
※ permission_classes 데코레이터는 APIView 클래스를 상속받은 모든 뷰에서 사용할 수 있음
permission_classess 예시
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
class MyView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
# 요청에 대한 인증 및 권한 확인을 수행합니다.
# ...
위의 예제에서 IsAuthenticated 권한 클래스는 요청을 보낸 사용자가 인증된 사용자인지 확인함 (로그인)
또한 permission_classes 데코레이터는 여러 개의 권한 클래스를 지정할 수 있다.
permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
권한 클래스 정의
Django REST framework에서 사용할 수 있는 Permission 클래스는 'BasePermission' 클래스를 상속하여 정의할 수 있음
BasePermission 클래스는 요청에 대한 인증 및 권한 확인을 위한 메서드 has_permission 및 has_object_permission 을 제공함
has_object_permission
from rest_framework.permissions import BasePermission
class IsOwnerOrReadOnly(BasePermission):
"""
객체 소유자만 수정을 허용하며,
읽기 권한은 모두에게 허용합니다.
"""
def has_object_permission(self, request, view, obj):
# GET, HEAD, OPTIONS 요청은 항상 허용합니다.
if request.method in permissions.SAFE_METHODS:
return True
# 요청한 사용자가 객체의 소유자인 경우에만 수정 권한을 허용합니다.
return obj.owner == request.user
위의 예제에서 요청이 GET, HEAD, OPTIONS인 경우 항상 허용하고, 그 외의 경우에는 요청한 사용자가 객체의 소유자인 경우에만 요청을 허용하도록 함
has_object_permission 메서드는 request, view, obj를 인자로 받음
- request 인자 : 요청 객체
- view 인자 : 요청을 처리할 뷰 객체
- obj 인자 : 권한을 확인하려는 객체
- True 반환 : 요청 허용
- False 반환 : 요청 거부
has_permission
from rest_framework.permissions import BasePermission, IsAuthenticated
class IsAuthenticated(BasePermission):
"""
요청한 사용자가 인증되어 있는지 확인합니다.
"""
def has_permission(self, request, view):
# 인증된 사용자만 요청을 수행할 수 있습니다.
return bool(request.user and request.user.is_authenticated)
위의 예제는 요청한 사용자가 인증되어 있는 경우에만 요청을 허용하도록 함
has_permission 메서드는 request와 view를 인자로 받음
- request 인자 : 요청 객체
- view 인자 : 요청을 처리할 뷰 객체
- True 반환 : 요청 허용
- False 반환 : 요청 거부
※ 즉, has_permission 메서드는 모든 객체에 대한 권한을 확인하는 데 사용하며,
has_object_permission 메서드는 개별 객체에 대한 권한 검사를 수행하는데 사용함