์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[auth] django์˜ permission

sgaeng 2024. 10. 8. 07:45

DRF์˜ Permission System์˜ ์ข…๋ฅ˜

์ฐธ๊ณ  : https://www.django-rest-framework.org/api-guide/permissions/#api-reference

  1. AllowAny (๋””ํดํŠธ ์ „์—ญ ์„ค์ •)
    1. ์ธ์ฆ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ๋ทฐ ํ˜ธ์ถœ ํ—ˆ์šฉ
    2. ๊ณต๊ฐœ 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