[DRF] - permission_classes

오동훈·2022년 11월 13일
0

Django

목록 보기
9/23

우선 우리는 프로젝트를 구성하다 보면 사용자가 로그인을 한 사용자인지, 그 유저가 접근 권한이 있는지 등 여러가지 체크할 필요성이 생기게 됩니다.

원래 코드 하나하나 권한 체크를 해주었는데 코드가 길어지고 중복되는 부분들이 많아 찾아보았더니 DRF에서 제공하는 permission_classes가 존재하더라구요~?!?!!!! 그래서 소개합니다~!!

1. IsAuthenticated

우선 첫 번째로 IsAuthenticated입니다.

1. 사용법

사용법은 다음과 같습니다. Class 내부에서 사용해주면 됩니다.

from rest_framework.permissions import IsAuthenticated

permission_classes = [IsAuthenticated]

2. 이게 무엇인고

IsAuthenticated를 따라 들어가 확인하면 아래의 코드와 같습니다.

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

총 2가지를 체크하는데 한 번 살펴보면 다음과 같습니다.

1. request.user

Django는 세션과 미들웨어를 사용해 인증 시스템을 request 객체에 연결합니다. 이를 통해 사용자를 나타내는 모든 요청에 request.user를 제공하는데요!

request.user는 다음과 같이 두 가지 케이스로 나뉘게 됩니다.

  1. 사용자가 로그인 한 경우 : User 클래스의 인스턴스로 설정
  2. 사용자가 로그인 하지 않은 경우 : AnonymousUser 클래스의 인스턴스로 설정

2. request.user.is_authenticated

is_authenticated는 대상 User 객체의 로그인 여부를 확인합니다.

  1. 로그인 한 경우 : True 반환
  2. 로그인 하지 않은 경우 : False 반환

3. 정리

따라서 permission_classes = [IsAuthenticated]로 설정해주게 되면 GET, POST, PUT, DELETE로 들어오는 모든 메소드들이 해당되어 인증을 필수로 해야합니다.

하지만 글을 생성하거나 수정, 삭제하는데는 권한을 주고 전체 보여주는 부분에서는 권한을 안주고 싶을 때는 그러면 각 코드마다 적어야 할까요~?
DRF는 다 준비되어 있습니다. 다음을 보시죠~

2. IsAuthenticatedOrReadOnly

우선 첫 번째로 IsAuthenticatedOrReadOnly입니다.

1. 사용법

사용법은 다음과 같습니다. Class 내부에서 사용해주면 됩니다.

from rest_framework.permissions import IsAuthenticatedOrReadOnly

permission_classes = [IsAuthenticatedOrReadOnly]

2. 이게 무엇인고

IsAuthenticatedOrReadOnly를 따라 들어가 확인하면 아래의 코드와 같습니다.

SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')

class IsAuthenticatedOrReadOnly(BasePermission):
    """
    The request is authenticated as a user, or is a read-only request.
    """

    def has_permission(self, request, view):
        return bool(
            request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated
        )

IsAuthenticated에 비해 1가지를 더 체크하는데 한 번 살펴보면 다음과 같습니다.

1. request.method in SAFE_METHODS

SAFE_METHODS에는 ('GET', 'HEAD', 'OPTIONS')를 포함하고 있습니다. 읽기 전용 메소드들 입니다.
앞서 저희가 원했던 GET 부분에 해당하는 메소드는 인증을 안거치고 싶을 때 IsAuthenticatedOrReadOnly를 사용해주면 된다는 것을 알 수 있습니다.

3. 정리

따라서 permission_classes = [IsAuthenticatedOrReadOnly]로 설정해주게 되면 GET은 인증이 따로 필요 없고, POST, PUT, DELETE로 들어오는 모든 메소드들은 해당되어 인증을 필수로 해야합니다.


참고 자료 📩

Django - Permissions 공식 문서

profile
삽질의 기록들🐥

0개의 댓글