본문 바로가기

Dev./Django.

[DRF] Custom Permission 생성- BasePermission

728x90

 

permission_classes

DRF는 API View에서 요청을 처리하기 전에 실행되는 인증 및 권한 검사를 위해 permission_classes 속성을 제공한다. 보안을 위해 클라이언트의 요청이 특정 권한을 가지고 있는지 확인하는 데 사용되며 APIView 클래스에서 상속받아 사용할 수 있다.

 

클래스의 종류

DRF는 몇가지 기본 클래스를 제공하고 직접 커스텀 하여 권한 클래스 사용할 수도 있다.

  1. AllowAny : 모든 요청에 대해 인증 없이 접근을 허용
  2. IsAuthenticated : 인증된 사용자만 접근을 허용
  3. IsAdminUser : 관리자 권한을 가진 사용자만 접근을 허용
  4. IsAuthenticatedOrReadOnly : 인증된 사용자는 모든 HTTP 메소드를 사용할 수 있지만, 인증되지 않은 사용자는 GET, HEAD, OPTIONS 메소드에만 접근을 허용
  5. DjangoModelPermissions : Django의 모델 권한을 기반으로 인증된 사용자만 접근을 허용
  6. DjangoModelPermissionsOrAnonReadOnly : 인증된 사용자는 Django의 모델 권한을 기반으로 모든 HTTP 메소드를 사용할 수 있지만, 인증되지 않은 사용자는 GET, HEAD, OPTIONS 메소드에만 접근을 허용
  7. DjangoObjectPermissions : Django의 객체 권한을 기반으로 인증된 사용자만 접근을 허용
  8. CustomPermission : 직접 만들어서 사용 가능한 권한 클래스

 

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {'message': 'This is an example'}
        return Response(content)

    👉🏻 IsAuthenticated 클래스를 permission_classes에 추가하면, ExampleView에 접근하려는 사용자가 인증되었는지 확인하고, 인증되지 않은 경우에는 접근을 거부하며 HTTP 401 Unauthorized 오류를 반환한다.

 

 

CustomPermission

위에서 언급햇지만 커스텀 권한 클래스를 추가할 수 있다.  CustomPermission는 DRF에서 기본적으로 제공하는 BasePermission 클래스를 상속받아서 만들 수 있다.

 

has_permission()

모든 HTTP 요청에 대해 호출되는 권한 로직을 작성 메서드로 오버라이딩하여 사용자 정의 권한 로직을 작성할 수 있다. has_permission() 메서드는 request 객체를 받아서, 해당 요청에 대한 권한 여부를 boolean 값으로 반환한다. 만약 해당 요청에 대해 권한이 있는 경우 True,권한이 없는 경우 False를 반환한다.

  • request : request object는 HTTP 요청에 대한 정보를 포함하고 있다.request.user 속성을 사용하여 요청한 사용자를 나타내는 Django User 모델 객체를 가져올 수 있다.
  • view :  요청을 처리하는 API view 클래스이다. view 객체를 사용하여 현재 뷰에서 처리되는 API view 클래스의 속성에 접근할 수 있다.

 

from rest_framework import permissions

class IsStaffUser(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user.is_staff:
            return True
        else:
            return False

    👉🏻 스태 권한을 가지고 있는 경우에만 접근을 허용하는 예시 커스텀 권한 클래스를 구현해보았다.  BasePermission 클래스를 상속받아 has_object_permission 메서드를 오버라이드하여 사용자의 스태프 권한을 확인하는 로직이다. 이 커스텀 클래스는 permission_class 리스트에 추가해 사용할 수 있다.

 

 

has_object_permission()

 

사용자가 요청한 객체에 대한 권한을 가지고 있는지 여부를 결정해 사용자에게 권한이 허용되면 True, 아니면 False를 반환하는 메서드이다.

 

  • request: request object는 HTTP 요청에 대한 정보를 포함하고 있다.request.user 속성을 사용하여 요청한 사용자를 나타내는 Django User 모델 객체를 가져올 수 있다.
  • view:  요청을 처리하는 API view 클래스이다. view 객체를 사용하여 현재 뷰에서 처리되는 API view 클래스의 속성에 접근할 수 있다.
  • obj: 권한을 확인해야 하는 객체이다.

 

from rest_framework import permissions

class IsTargetUser(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.user == obj or request.user.is_staff:
            return True
        else:
            return False

    👉🏻 request user가 해당 객체의 소유자인 경우에만 권한을 허용하는 예시 커스텀 클래스이다.

 

 

두가지 메서드의 차이

has_permission() 메서드는 API View의 사용자의 모든 요청,전체 인스턴스에 대한 권한을 검사하는 데 사용되고 has_object_permission() 메서드는 특정 개체에 대한 권한을 확인하는 데 사용된다.

 

has_permission() 메서드는 request 와 view를 매개변수로 받아 해당 요청에 대한 권한을 검사한다. 

ex.)사용자가 API View를 호출할 수 있는지 여부 결정, 요청된 데이터를 조회할 수 있는지 여부 결정

 

has_object_permission() 메서드는 has_permission() 메서드와 유사하지만, request 와 view 뿐 아니라 obj도 매개변수로 받는다. ex.) 특정 인스턴스를 수정할 수 있는지 여부 결정, 특정 인스턴스를 삭제할 수 있는지 여부 결정

 

728x90
반응형