프로그램 개발에 있어 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를 확인한 결과입니다.
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가 앞서 보여주었던 결과와 같은 요청을 보냈을 때의 결과 화면입니다.
그림에서 확인할 수 있듯이 요청이 거부된 것을 확인할 수 있습니다. rest api에서 기능에 맞게 권한을 설정해주는 것은 중요합니다. 따라서 더 자세한 내용을 위해서는 다음의 홈페이지를 참고하시면 됩니다.
'Python > Django' 카테고리의 다른 글
[Django] context_processor는 뭐야? (0) | 2021.07.20 |
---|---|
[Django] AWS Lightsail 사용하여 프로젝트 공개 (0) | 2021.07.19 |
[Django] Proxy Model은 뭐야? (0) | 2021.07.14 |
[Django] Serializer가 뭐야? (0) | 2021.07.13 |
[Django] post_save()는 뭐야? (0) | 2021.07.12 |