우선 우리는 프로젝트를 구성하다 보면 사용자가 로그인을 한 사용자인지, 그 유저가 접근 권한이 있는지 등 여러가지 체크할 필요성이 생기게 됩니다.
원래 코드 하나하나 권한 체크를 해주었는데 코드가 길어지고 중복되는 부분들이 많아 찾아보았더니 DRF에서 제공하는 permission_classes가 존재하더라구요~?!?!!!! 그래서 소개합니다~!!
우선 첫 번째로 IsAuthenticated
입니다.
사용법은 다음과 같습니다. Class 내부에서 사용해주면 됩니다.
from rest_framework.permissions import IsAuthenticated
permission_classes = [IsAuthenticated]
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가지를 체크하는데 한 번 살펴보면 다음과 같습니다.
Django는 세션과 미들웨어를 사용해 인증 시스템을 request 객체에 연결합니다. 이를 통해 사용자를 나타내는 모든 요청에 request.user
를 제공하는데요!
request.user
는 다음과 같이 두 가지 케이스로 나뉘게 됩니다.
- 사용자가 로그인 한 경우 : User 클래스의 인스턴스로 설정
- 사용자가 로그인 하지 않은 경우 : AnonymousUser 클래스의 인스턴스로 설정
is_authenticated
는 대상 User 객체의 로그인 여부를 확인합니다.
- 로그인 한 경우 : True 반환
- 로그인 하지 않은 경우 : False 반환
따라서 permission_classes = [IsAuthenticated]
로 설정해주게 되면 GET, POST, PUT, DELETE
로 들어오는 모든 메소드들이 해당되어 인증을 필수로 해야합니다.
하지만 글을 생성하거나 수정, 삭제하는데는 권한을 주고 전체 보여주는 부분에서는 권한을 안주고 싶을 때는 그러면 각 코드마다 적어야 할까요~?
DRF는 다 준비되어 있습니다. 다음을 보시죠~
우선 첫 번째로 IsAuthenticatedOrReadOnly
입니다.
사용법은 다음과 같습니다. Class 내부에서 사용해주면 됩니다.
from rest_framework.permissions import IsAuthenticatedOrReadOnly
permission_classes = [IsAuthenticatedOrReadOnly]
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가지를 더 체크하는데 한 번 살펴보면 다음과 같습니다.
SAFE_METHODS
에는 ('GET', 'HEAD', 'OPTIONS')
를 포함하고 있습니다. 읽기 전용 메소드들 입니다.
앞서 저희가 원했던 GET
부분에 해당하는 메소드는 인증을 안거치고 싶을 때 IsAuthenticatedOrReadOnly
를 사용해주면 된다는 것을 알 수 있습니다.
따라서 permission_classes = [IsAuthenticatedOrReadOnly]
로 설정해주게 되면 GET
은 인증이 따로 필요 없고, POST, PUT, DELETE
로 들어오는 모든 메소드들은 해당되어 인증을 필수로 해야합니다.
참고 자료 📩