Django

[Django] Django 인증 및 권한 시스템 - permission_classes

청담동누룽이 2023. 4. 6. 11:50

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 메서드는 개별 객체에 대한 권한 검사를 수행하는데 사용함