[Project] Threepark

[Capstone Design] 3. 백엔드 구현 - (6) DRF 개발 | PERMISSION

mingyung 2024. 5. 21. 14:52

뷰를 작성하기에 앞서서 접근의 제어를 위한 커스텀 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