Permission class와 커스터마이징
Django에서 사용할 수 있는 permissions 와 상속받아서 커스터마이징하는 방법 정리
0. Permission의 이유
로그인 한 사용자만 게시글을 작성할 수 있다던가
모두가 글을 작성할 수 있다던가
관리자만 글을 삭제할 수 있다던가...
작성한 사용자만 게시글을 볼 수 있다던가...
1. DRF Built-in permission class
AllowAny | 모두 허용(인증같은거 필요 없음) |
IsAuthenticated | 인증된 사용자만 접근 가능 |
IsAdminUser | user_customuser의 is_staff=True인 사용자만 접근 가능 |
IsAuthenticatedOrReadOnly | 인증된 사용자는 쓰기 가능, 비인증 사용자는 읽기만 가능 |
DjangoModelPermissions | Model에서 만든 권한에 따라 |
DjangoModelPermissionsOrAnonReadOnly | Model에서 만든 권한에 따라서 인증 없으면 읽기만 |
2. permission class Customizing
=> permissions.py 파일을 작성한다.
from rest_framework import permissions
class IsOwnerOrAdmin(permissions.BasePermission): #BasePermission 상속
def has_object_permission(self, request, view, obj):
return obj.user == request.user or request.user.is_staff
#object의 user와 요청한 user가 같거나/is_staff가 True인 경우
3. permission은 어디에 붙이는가
=> Views.py에
A.Class based views(CBV)인 경우
class SuggestionDeleteView(generics.DestroyAPIView):
queryset = Suggestion.objects.all()
serializer_class = SuggestionSerializer
permission_classes = [permissions.IsAuthenticated, IsOwnerOrAdmin] #permission_classes를 이렇게 정하거나
B.Function based views
@api_view(['DELETE'])
@permission_classes([permissions.IsAuthenticated, IsOwnerOrAdmin]) #데코레이터로 처리