코딩한걸음
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
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!