[auth] django์ permission
DRF์ Permission System์ ์ข ๋ฅ
์ฐธ๊ณ : https://www.django-rest-framework.org/api-guide/permissions/#api-reference
- AllowAny (๋ํดํธ ์ ์ญ ์ค์ )
- ์ธ์ฆ ์ฌ๋ถ์ ์๊ด์์ด ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ทฐ ํธ์ถ ํ์ฉ
- ๊ณต๊ฐ API์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import AllowAny class PublicAPIView(APIView): permission_classes = [AllowAny] def get(self, request): # ๊ณต๊ฐ API์์ ๋ฐํํ ๋ฐ์ดํฐ data = { "message": "Welcome to the public API!" } return Response(data)
2. IsAuthenticated
- ์ธ์ฆ๋ ์์ฒญ์ ํํด์ ๋ทฐ ํธ์ถ ํ์ฉ (๋ก๊ทธ์ธ์ด ๋์ด์์ด์ผ๋ง ์ ๊ทผ ํ์ฉ)
- ์ฌ์ฉ์ ์ ๋ณด์ ๊ฐ์ ๊ฐ์ธ์ ์ธ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ์ฌ์ฉ
class PrivateAPIView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
# ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ๋ฐํํ ๊ฐ์ธ ์ ๋ณด
data = {
"message": "Welcome to the private API!",
"user": request.user.username
}
return Response(data)
3. IsAdminUser
- ๊ด๋ฆฌ์ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ, is_staff ์์ฑ์ด True์ธ ์ฌ์ฉ์๋ง ํ์ฉ
- ๊ด๋ฆฌ ๋์๋ณด๋๋ ํน์ ๊ด๋ฆฌ ์์ ์ ์ฌ์ฉํจ
4. IsAuthenticatedOrReadOnly
- ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ๋ ๋ชจ๋ ๊ถํ์ ๋ถ์ฌํ๊ณ , ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์์๊ฒ๋ ์ฝ๊ธฐ ์ ์ฉ ์ ๊ทผ ํ์ฉ
- ๊ณต๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ ์ฝ์ ์ ์์ง๋ง, ์์ฑํ๊ฑฐ๋ ์์ ํ ์๋ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ
๊ทธ ์ธ์๋ DRF์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์
DjangoModelPermissons
DjangoModelPermissionsOrAnonReadOnly
DjangoObjectPermissons
๋ ์์ง๋ง ์ฌ์ค ์์ 3๊ฐ์ง๋ ์ ์ฌ์ฉํ์ง ์๋๋ค
์ฐจ๋ผ๋ฆฌ BasePermission ๋ฅผ ์ง์ ์์ ๋ฐ์์ ์ปค์คํ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค
์ฐธ๊ณ : https://www.django-rest-framework.org/api-guide/permissions/#custom-permissions
permission์ ์ปค์คํ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค
class AlarmPermission(permissions.BasePermission):
def has_permission(self, request, view):
return super().has_permission(request, view)
def has_object_permission(self, request, view, obj):
return super().has_object_permission(request, view, obj)
์์ ๊ฐ์ ํํ๊ฐ ๊ธฐ๋ณธ์ด๋ค.
์ฌ๊ธฐ์์ ๋ด๊ฐ ์ํ๋๋๋ก ์ ํจ์ฑ ๊ฒ์ฆํด์ฃผ๋ฉด ๋๋ค.
True์ด๋ฉด ํด๋น API ์ ๊ทผ์ด ํ์ฉ
False์ด๋ฉด ์ ๊ทผ ๋ถ๊ฐ ์ด๋ค.
has_permission() ๊ณผ has_object_permission() ์ ์ฐจ์ด์
- POST (์์ฑ): has_permission๋ง ํธ์ถ.
- PUT/PATCH (์์ ): has_permission๊ณผ has_object_permission ๋ชจ๋ ํธ์ถ.
- DELETE (์ญ์ ): has_permission๊ณผ has_object_permission ๋ชจ๋ ํธ์ถ.
class Permission(permissions.BasePermission):
def has_permission(self, request, view):
return super().has_permission(request, view)
def has_object_permission(self, request, view, obj):
return super().has_object_permission(request, view, obj)
has_permission()
- end-point์์: {id}๋ฅผ ๋ฐ์ง ์๋ ๋ฉ์๋
- LIST GET
- POST
- ์์ธ) detail GET
has_object_permission()
- end-point์์: {id}๋ฅผ ๋ฐ๋ ๋ฉ์๋
- PUT / PATCH
- DELETE