본문 바로가기

코딩

perms_map < permissions < REST Framework

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'],
}
 

 


 

구조 설명

  1. : HTTP 메소드 (GET, POST, PUT, 등)
  2. : 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 요청에 대한 권한 체크를 제거
    }
 
 

 

주요 포인트

  1. Django 권한과의 통합
    REST API와 Django의 권한 시스템을 매끄럽게 연결해준다.
  2. 세부 권한 제어 가능
    perms_map을 커스터마이징하여 각 HTTP 메소드에 대해 다른 권한 정책을 적용할 수 있다.
  3. DjangoObjectPermissions와 Object-Level 권한
    이 퍼미션은 객체 단위 권한(예: user.has_perm("app.view_model", obj))을 기본적으로 적용한다.
  4. 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
반응형