뷰를 작성하기에 앞서서 접근의 제어를 위한 커스텀 permissions를 작성하자.
permissions.py
먼저 permissions.py를 settings.py가 있는 폴더에 생성한다.
이 폴더에 커스텀 permissions를 작성할 것이다.
import
permissions.py의 상단에 다음을 import 해야 한다.
from rest_framework import permissions
Permission 작성
총 세가지의 permission을 작성할것이다.
1. 본인의 데이터만 접근가능하게 하는 IsOwner
2. 본인만 수정,삭제할 수 있게 하되 허용된 팔로워에게는 조회할 수 있게 하는 IsOwnerOrReadOnly
3. 팔로잉 신청 시 본인과 팔로잉 신청에 관련된 사람만 조회,편집할 수 있게 하는 IsFollowerOrOwner
IsOwner
데이터의 소유자만 접근하고 수정 삭제 할 수 있게 한다
class IsOwner(permissions.BasePermission):
"""
본인의 data만 접근 가능하다.
"""
def has_permission(self, request, view):
return request.user.is_authenticated
def has_object_permission(self, request, view, obj):
return obj.user == request.user
IsOwnerOrReadOnly
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
객체를 만든 사용자만 수정할 수 있다.
"""
def has_permission(self, request, view):
return request.user.is_authenticated
def has_object_permission(self, request, view, obj):
# 요청한 사용자가 해당 객체의 소유자인 경우에만 쓰기 권한을 부여함
return obj.follower == request.user or obj.following_user == request.user
IsFollowerOrOwner
class IsFollowerOrOwner(permissions.BasePermission):
"""
Custom permission to allow reading followed items only if they are open.
"""
def has_permission(self, request, view):
return request.user.is_authenticated
def has_object_permission(self, request, view, obj):
# Check if the request method is safe (GET, HEAD, OPTIONS)
if request.method in permissions.SAFE_METHODS:
if Follow.objects.filter(follower=request.user, following_user=obj.user, status='accepted').exists() | Follow.objects.filter(follower=obj.user, following_user=request.user, status='accepted').exists():
return obj.is_open
return obj.user == request.user
'[Project] Threepark' 카테고리의 다른 글
[Threepark] 백엔드 서버와 핵심 기능 구현 (0) | 2024.05.21 |
---|---|
[Capstone Design] 3. 백엔드 구현 - (7) DRF 개발 | VIEW (0) | 2024.05.21 |
[Capstone Design] 3. 백엔드 구현 - (5) DRF 개발 | SERIALIZER (0) | 2024.05.21 |
[Capstone Design] 3. 백엔드 구현 - (4) DRF 개발 | DB & MODEL (0) | 2024.05.21 |
[Capstone Design] 3. 백엔드 구현 - (3) Django에 RDS 연결하기 (0) | 2024.05.14 |