반응형
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 |
댓글