728x90
반응형
Today I Learned
어떤 문제가 있었는지
진행하고있는 DRF project에서 인증관련으로 permission을 사용해봤는데
내가 원하는 조건- GET : 모두 허용, 그 외 : admin만 가능 -으로 할 수가 없었다
내가 시도해 본 것들
먼저 DRF의 permission 종류를 찾아봤다
AllowAny : django에서 default로 전역설정 되어있다. 인증 여부에 상관없이, view 호출
IsAuthenticated : 회원 인증된 요청에만 view 호출
IsAuthenticatedOrReadOnly : 비인증 요청은 읽기 권한만 허용, 인증된 요청은 모든 권한
IsAdmin : admin이나 staff 인증 요청에만 view 호출
여기서 permission_classes는 or, and 연산이 가능해서
permission_classes = [permissions.IsAuthenticatedOrReadOnly, permissions.IsAdmin]
이런식으로도 써보고 여러가지를 다 써봤으나 내가 원하는 조건인
1. 읽기는 모두허용, 그 외는 admin만 가능
2. 글을 쓸 사용자만 수정/삭제 가능
하게 할 수가 없었다.
그래서 찾아보니 custom해서 원하는 조건으로 쓰면 된다고 함
어떻게 해결 했는지
먼저 프로젝트 메인 폴더에 permissions.py를 생성하고
## main/permissions.py
from rest_framework import permissions
class IsAdminUserOrReadonly(permissions.BasePermission):
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
if not request.user.is_authenticated:
return False
return request.user and request.user.is_admin
class IsAuthorOrReadonly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
내가 원하는 조건에 맞춰 권한을 작성해준다
- has_permission() 메서드는 view에 대한 권한을 검사
인증된 사용자만 해당 view에 대한 요청을 허용 - has_object_permission() 메서드는 특정 객체(object)에 대한 검사
요청한 사용자가 해당 객체의 소유자인 경우에 허용
추가적으로 view에 object를 정의해줘야 사용 가능하다
class ProductReviewDetailView(APIView):
permission_classes = [IsAuthorOrReadonly]
def get_object(self):
obj = get_object_or_404(ProductReview, id=self.kwargs["review_id"])
self.check_object_permissions(self.request, obj)
return obj
이렇게 get_object를 사용해서 permission을 적용시킬 객체를 찾고 그 객체의
소유자인 경우에 요청을 허용하고 나머지는 읽기만 가능하게 코딩을 했다.
## products/views.py
from main.permissoins import *
import 해주면 원하는 곳에 사용할 수 있다
무엇을 새롭게 배웠는지
permission의 작동방식과 custom하는 방법
728x90
반응형