728x90
반응형
Django REST framework에서 perms_map은 기본적으로 Django의 권한 시스템과 통합하여 HTTP 메소드에 따라 권한을 매핑할 때 사용되는 속성이다. 주로 DjangoObjectPermissions 클래스와 이를 확장한 커스텀 퍼미션 클래스에서 활용된다.
주요 역할
- HTTP 요청 메소드(GET, POST, PUT, 등)에 따라 Django 모델의 권한(add, change, delete, view)을 매핑한다.
- 요청 메소드에 맞는 권한을 확인하고, 사용자가 해당 권한을 가졌는지 판단한다.
기본 동작
DjangoObjectPermissions 클래스에서 기본적으로 정의된 perms_map의 구조는 아래와 같다:
perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'],
'OPTIONS': [],
'HEAD': [],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
구조 설명
- 키: HTTP 메소드 (GET, POST, PUT, 등)
- 값: Django 권한의 목록.
각 권한 문자열은 Django의 모델 권한 이름(app_label.action_model_name)과 매핑된다.- %(app_label)s: Django 앱의 이름
- %(model_name)s: 모델 이름
예:
- GET 요청은 view_<모델> 권한을 요구한다.
- POST 요청은 add_<모델> 권한을 요구한다.
- DELETE 요청은 delete_<모델> 권한을 요구한다.
사용 예시
DjangoObjectPermissions를 사용하는 예:
from rest_framework.permissions import DjangoObjectPermissions
from rest_framework.viewsets import ModelViewSet
from myapp.models import Article
from myapp.serializers import ArticleSerializer
class ArticleViewSet(ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [DjangoObjectPermissions]
이 경우, 요청자가 특정 HTTP 메소드를 호출하려면 대응하는 Django 권한(view_article, add_article, change_article, delete_article)을 가져야 한다.
perms_map 커스터마이징
DjangoObjectPermissions를 상속받아 perms_map을 수정하면, 특정 메소드와 권한 매핑을 변경할 수 있다.
from rest_framework.permissions import DjangoObjectPermissions
class CustomObjectPermissions(DjangoObjectPermissions):
perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': [], # DELETE 요청에 대한 권한 체크를 제거
}
주요 포인트
- Django 권한과의 통합
REST API와 Django의 권한 시스템을 매끄럽게 연결해준다. - 세부 권한 제어 가능
perms_map을 커스터마이징하여 각 HTTP 메소드에 대해 다른 권한 정책을 적용할 수 있다. - DjangoObjectPermissions와 Object-Level 권한
이 퍼미션은 객체 단위 권한(예: user.has_perm("app.view_model", obj))을 기본적으로 적용한다. - view 권한 추가 필요
Django 2.1 이상에서는 view 권한이 기본 제공되므로 이를 사용하려면 auth 앱의 마이그레이션이 적용되어 있어야 한다.
구현 사례
# api/permissions.py
from rest_framework import permissions
class IsStaffEditorPermission(permissions.DjangoModelPermissions):
perms_map = {
'GET': ['%(app_label)s.view_%(model_name)s'],
'OPTIONS': [],
'HEAD': [],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}728x90
반응형
'코딩' 카테고리의 다른 글
| Django 웹 프레임워크 "Hello World" (0) | 2025.01.01 |
|---|---|
| Django Templates 설정 (1) | 2024.12.29 |
| 'validate_'; django REST framework 예약어 (4) | 2024.12.18 |
| 메소드 > perform_create(); 생성을 실행하라! (0) | 2024.12.17 |
| Reverse URL 만들기 < viewsets + router 환경에서 (2) | 2024.12.16 |