본문 바로가기
  • 실행력이 모든걸 결정한다
Django Rest Framework

[DRF] BasePermission으로 커스텀 권한 만들기

by 김코더 김주역 2023. 3. 9.
반응형

BasePermission을 상속받아 커스텀 권한을 만들어서 IsAuthenticated, IsAdminUser 클래스처럼 사용할 수 있다.

먼저, BasePermission은 주석을 제외하면 다음과 같은 모습이다. has_permission(), has_object_permission() 메소드가 보이는데, 두 메소드가 항상 True를 반환하고 있다는 것은 기본적으로 모든 액세스를 허용한다는 뜻이다.

class BasePermission(metaclass=BasePermissionMetaclass):

    def has_permission(self, request, view):
        return True

    def has_object_permission(self, request, view, obj):
        return True

 

has_permission(), has_object_permission() 메소드는 권한이 없는 사용자를 차단하기 위해 호출되는 메소드들이다. 

has_permission() 메소드는 모든 HTTP 요청시 호출되는 반면, has_object_permission() 메소드는 DRF의 get_object() 메소드로부터 호출된다는 차이점이 있다. 즉, has_object_permission() 메소드는 기본적으로 POST 요청시에는 호출되지 않는다.

예를 들어, 게시글의 작성자 또는 관리자의 접근만 허용하는 경우에는 다음과 같이 커스텀 권한을 만들 수 있을 것이다.

class IsOwnerOrAdmin(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.user == request.user or request.user.is_superuser

 

[적용 예시]

def get_permissions(self):
    if self.action in ['list', 'retrieve']:
        self.permission_classes = []
    elif self.action in ['partial_update', 'destroy']:
        self.permission_classes = [IsSnackRequestOwnerOrAdmin]
    else:
        self.permission_classes = [IsAuthenticated]
    return super().get_permissions()

 

반응형

'Django Rest Framework' 카테고리의 다른 글

[DRF] 공식 문서 요약(1) - Serializers  (0) 2023.05.07
[DRF] DRF 뷰의 발전 과정  (0) 2023.02.23
[DRF] DRF Serializer  (0) 2023.02.21
[DRF] Django REST Framework란 무엇일까?  (0) 2023.02.21

댓글