프로젝트 지식(9) - has_object_permission 호출

less than 1 minute read

has_object_permission 호출

지금까지 has_object_permission 호출에 대해서 잘못 인지하고 있었다. 분명히 postman으로 테스트할 때는 잘 됐던걸로 기억하는데 이상하다… 내가 잘못 테스트를 하고 있었나. 하여튼 permission은 보안 관련된 부분이기 때문에 아주 예민하게 다뤄야 하는데 내가 너무 안일했던 것 같다.

has_object_permission은 has_permission처럼 자동적으로 호출이 되지 않기 때문에 self.check_object_permissions(self.request, obj)로 직접 호출해주어야 하는데, 이것 또한 has_permission의 결과가 True여야 호출된다.

def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        elif request.method in ('POST', 'PUT'):
            return request.user.id == request.data.get('user')
        elif request.method == 'DELETE':
            return True
        else:
            return False

    def has_object_permission(self, request, view, obj):
        if request.user.is_authenticated:
            if request.user.is_staff:
                return True
            elif hasattr(obj, 'user'):
                return obj.user.id == request.user.id
            elif obj.__class__ == get_user_model():
                return obj.user.id == request.user.id
            return False
        else:
            return False

예를 들어 다음과 같은 permission이 있다. DELETE를 하는데 특정 obj의 값이 필요해 has_object_permission이 필요하다면 우선 has_permission으로 먼저 DELETE 값에 대해 True 값이 되면 그제서야 self.check_object_permissions(self.request, obj)을 통해서 has_object_permission이 호출이 되는 것이다.

Leave a comment