[DRF] Custom Permission- URL based permission
URL-based permission
URL 패턴에 따라 사용자에게 다른 권한을 부여하는 방식을 의미한다.
URL dispatcher
Django는 일반적으로 URLconf 파일을 가지고 있다. URLconf 파일은 각 app단의 urls.py 모듈에서 정의된다. 이 파일에는 urlpatterns 변수를 정의하고, 이 변수는 URL 패턴을 리스트로 나타내며, 각 패턴은 path() 또는 re_path() 함수를 사용하여 정의한다.
Django는 URLconf 파일에 URL 패턴을 정의하고 각 패턴에 대해 어떤 view 함수나 클래스를 호출할지를 지정해 매칭시킨다. URL dispatcher는 HTTP요청이 들어올 때마다 적절한 url에 연결해주는 기능을 의미한다. 이러한 기능을 기반으로 특정 URL 패턴에 대해서만 허용되는 권한을 커스텀 할 수 있다.
Custom permission 적용하기
# 프로젝트단 urls.py
from django.urls import path, include
from exapp.permissions import IsStaffUser
urlpatterns = [
path('apiv1/', include('apiv1.urls', namespace='apiv1',)),
path('apiv2/', include('apiv2.urls', namespace='apiv1',)),
path('apiv3/', include('apiv3.urls', namespace='apiv1',)),
]
예시로 프로젝트의 최상위 URLConf파일에 다음과 같은 urlpatterns 매핑 리스트가 존재할 때 apiv1.urls 모듈에 포함된 모든 URL 패턴에 대해서만 동일한 커스텀 권한을 적용하고 싶다면 어떻게 할까? 물론 뷰마다 permission_classes를 추가해 줄 수도 있지만 동일한 커스텀 권한이니 굉장히 귀찮은 일이다.
apiv1.urls 모듈 내의 URL 패턴에 permission_classes를 사용하여 설정할 수 있다. 즉 apiv1 앱단 url에서 퍼미션을 적용해줄 수 있다.
최상위 URLConf파일처럼 URL 패턴에 include() 함수를 사용하여 다른 URL 패턴을 포함하고 있을 경우, 포함된 URL 패턴의 뷰 클래스에 대한 퍼미션 설정은 포함하는 URL 패턴에서 설정할 수 있다.
# apiv1.urls
from django.urls import path
from exapp.permissions import IsStaffUser
from .views import MyView1, MyView2
urlpatterns = [
path('my-view-1/', MyView1.as_view(), name='my-view-1'),
path('my-view-2/', MyView2.as_view(), name='my-view-2'),
]
for urlpattern in urlpatterns:
urlpattern.callback.view_class.permission_classes = [IsStaffUser]
👉🏻 반복문으로 리스트의 각 URL 패턴의 callback 속성을 통해 연결된 뷰의 permission_classes을 이전에 만들어둔 커스텀 권한을 지정하겠다는 의미이다.