본문 바로가기

Python/Django

[Django] Permission은 뭐야?

728x90

프로그램 개발에 있어 admin이 가지고 있는 권한, user가 가지고 있는 권한, staff가 가지고 있는 권한이 각각 다릅니다. 예를 들어 어떤 user가 다른 user가 생성한 게시물을 삭제할 수 있는 권한을 가져서는 안 됩니다. 이때 Django Rest Framework에서 사용 가능한 기능이 바로 permission입니다. 그중에서도 Custom Permission에 대해서 알아보겠습니다. 다음은 permission 코드입니다.

 

# permissions.py
class IsOwnerOrReadOnly(permissions.BasePermission):

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

 

위의 코드는 request.method가 SAFE_METHODS ('GET', 'HEAD', 'OPTIONS')에 포함되거나 전달받은 obj의 user가 현재 로그인된 user와 같다면 API 요청 결과를 볼 수 있는 코드입니다. 따라서 해당 정보를 만든 user가 아니라면 조회나 등록만 가능하다는 것입니다. 다음은 id=1을 가진 user의 profille status를 확인한 결과입니다.

 

user 1의 profile status 결과 화면

log-in user가 작성자와 같으므로 PUT, DELETE 기능이 활성화 되있는 것을 확인할 수 있습니다.

 

BasePermission에는 has_permission, has_object_permission 함수가 존재합니다. 각각의 기능은 다음과 같습니다.

 

has_permission()

  • APIView 접근 시 확인

has_object_permission()

  • APIView의 object를 가져온 후에 확인

따라서 Permission 확인 시 has_permission을 먼저 실행하여 True인 경우만 has_object_permission의 코드를 실행하게 됩니다. 다음의 코드는 has_permission을 추가한 것입니다.

 

class IsOwnerOrReadOnly(permissions.BasePermission):

    def has_permission(self, request, view):
        return request.user.is_superuser

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

 

위와 같이 코드를 수정하면 superuser가 아닌 모든 user는 API 결과를 확인할 수 없습니다. 다음은 superuser가 아닌 user가 앞서 보여주었던 결과와 같은 요청을 보냈을 때의 결과 화면입니다.

 

일반 user가 요청한 결과 화면

그림에서 확인할 수 있듯이 요청이 거부된 것을 확인할 수 있습니다. rest api에서 기능에 맞게 권한을 설정해주는 것은 중요합니다. 따라서 더 자세한 내용을 위해서는 다음의 홈페이지를 참고하시면 됩니다.

728x90