당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF-Tutorial-25편- 객체단에서의 권한

Object Level Permissions


실제로 우리는, 모든 코드 스니펫들이 누구에게나 보여지지만 오직 해당 스니펫을 생성한 사용자만 업데이트 혹은 삭제를 할수 있게 만들고 싶습니다.


이것을 하기 위해서는, 커스텀 권한을 생성할 필요가 있습니다.


permissions.py 라는 파일을, snippet 앱 안에 생성해 줍니다. snippets/permissions.py 파일에, 아래 내용을 추가해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from rest_framework import permissions 


class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to edit it
"""
def has_object_permissions(self, request, view, obj):
# Read permissions are allowed to any request
# 읽기 권한은 어떤 요청에도 허용됨
# So we'll always allow GET, HEAD or OPTIONS requests
# 따라서, 우리는 언제나 GET, HEAD 혹은 OPTIONS 요청들을 허용함
if request.method in permissions.SAFE_METHODS:
return True

# Write permissions are only allowed to the owner of the snippet
# 해당 snippet 의 owner 만 작성 권한이 허용됨
return obj.owner == request.user

이제 이 커스텀 권한을 우리의 스니펫 인스턴스 앤드포인트에 추가해줍니다. SnippetDetail 뷰 클래스 안에 있는 permission_classes 속성에 추가해 줍니다.


1
2
permission_classes = [permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly]

우리가 작성한 IsOwnerOrReadOnly 클래스를 가져오는것을 까먹으면 안됩니다.


1
from snippets.permissions import IsOwnerOrReadOnly

이제, 브라우저를 다시 열어보면, 코드 스니펫을 생성한 사용자가 로그인 하였을때, DELETEPUT 액션들이 스니펫 인스턴스의 앤드포인트에만 나타나는것을 확인 할수 있습니다.