๐Ÿฅ”Project/[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