Skip to content

Commit a4a6bb9

Browse files
committed
update: 권한 관련 설정 추가
1 parent 5f8a639 commit a4a6bb9

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

sponsor/permissions.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from rest_framework import permissions
2+
3+
from sponsor.models import Sponsor
4+
5+
6+
class IsOwnerOrReadOnly(permissions.BasePermission):
7+
# https://stackoverflow.com/questions/72691826/djnago-rest-framework-how-to-allow-only-update-user-own-content-only
8+
def has_object_permission(self, request, view, obj: Sponsor):
9+
if request.method in permissions.SAFE_METHODS:
10+
return True
11+
12+
return obj.manager_id == request.user or obj.creator == request.user
13+
14+
15+
class OwnerOnly(permissions.BasePermission):
16+
def has_object_permission(self, request, view, obj: Sponsor):
17+
return obj.manager_id == request.user or obj.creator == request.user

sponsor/viewsets.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
from django.shortcuts import get_object_or_404
2-
3-
from rest_framework.viewsets import ModelViewSet
42
from rest_framework.permissions import IsAuthenticatedOrReadOnly
53
from rest_framework.response import Response
4+
from rest_framework.viewsets import ModelViewSet
65

7-
from sponsor.serializers import (
8-
SponsorSerializer,
9-
SponsorListSerializer,
10-
)
116
from sponsor.models import Sponsor
7+
from sponsor.permissions import IsOwnerOrReadOnly, OwnerOnly
8+
from sponsor.serializers import SponsorListSerializer, SponsorSerializer
129

1310

1411
class SponsorViewSet(ModelViewSet):
1512
serializer_class = SponsorSerializer
16-
permission_classes = [IsAuthenticatedOrReadOnly] # 로그인된 사용자에게만 허용
13+
permission_classes = [IsOwnerOrReadOnly] # 본인 소유만 수정가능
1714

1815
def get_queryset(self):
1916
return Sponsor.objects.all()
@@ -33,5 +30,17 @@ def retrieve(self, request, *args, **kwargs):
3330
pk = kwargs["pk"]
3431
sponsor_data = get_object_or_404(Sponsor, pk=pk)
3532

36-
serializer = SponsorSerializer(sponsor_data)
33+
# 본인 소유인 경우는 모든 필드
34+
# 그렇지 않은 경우는 공개 가능한 필드만 응답
35+
serializer = (
36+
SponsorSerializer(sponsor_data)
37+
if self.check_owner_permission(request, sponsor_data)
38+
else SponsorListSerializer(sponsor_data)
39+
)
40+
3741
return Response(serializer.data)
42+
43+
def check_owner_permission(self, request, sponsor_data: Sponsor):
44+
return OwnerOnly.has_object_permission(
45+
self=OwnerOnly, request=request, view=self, obj=sponsor_data
46+
)

0 commit comments

Comments
 (0)