우선 우리는 프로젝트를 구성하다 보면 사용자가 로그인을 한 사용자인지, 그 유저가 접근 권한이 있는지 등 여러가지 체크할 필요성이 생기게 됩니다.
원래 코드 하나하나 권한 체크를 해주었는데 코드가 길어지고 중복되는 부분들이 많아 찾아보았더니 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는 다음과 같이 두 가지 케이스로 나뉘게 됩니다.
- 사용자가 로그인 한 경우 : User 클래스의 인스턴스로 설정
- 사용자가 로그인 하지 않은 경우 : AnonymousUser 클래스의 인스턴스로 설정
2. request.user.is_authenticated
is_authenticated는 대상 User 객체의 로그인 여부를 확인합니다.
- 로그인 한 경우 : True 반환
- 로그인 하지 않은 경우 : 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' 카테고리의 다른 글
[DRF] - Unit Test (0) | 2024.11.12 |
---|---|
[DRF] - Pagination (0) | 2024.11.11 |
[DRF] - Transaction (0) | 2024.11.09 |
[DRF] - Serializer (0) | 2024.11.08 |
[DRF] - mixins (0) | 2024.11.07 |