Permissions
๐ object level permissions
โ๊ฐ์ฒด ์์ค์ ํ๊ฐ(๊ถํ)โ ๋ DRF์ generic view๊ฐ get_object() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์คํ๋๋ค.
โview ์์ค์ ํ๊ฐ(๊ถํ)โ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ๊ฐ์ฒด์ ๋ํ ์์ ์ ์งํํ ์ ์์ ๊ฒฝ์ฐ์๋
exceptions.PermissionDenied ์์ธ๊ฐ ๋ฐ์ํ๋ค.
๋ง์ผ ๋ด๊ฐ ์์ฑํ๋ view์์ โ๊ฐ์ฒด ์์ค์ ๊ถํโ์ ๊ฐํํ๊ณ ์ถ๊ฑฐ๋, genric view์์
get_object ๋ฅผ ์ฌ์ ์ํ๊ณ ์ถ๋ค๋ฉด, ๊ผญ .check_object_permissions(request, obj) ๋ฉ์๋๋ฅผ
๊ผญ ์์ฑํด์ค์ผ ํ๋ค.
1
2
3
4
5
# views.py
def get_object(self,pk):
post = get_object_or_404(self.queryset, pk=pk)
self.check_object_permissions(self.request, post)
return post
๐ permissions ์ปค์คํ ํ๊ธฐ
rest_framework/permissions.py ๋ก ๊ฐ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BasePermission(metaclass=BasePermissionMetaclass):
"""
A base class from which all permission classes should inherit.
"""
def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
has_permission ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ HTTP ์์ฒญ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค
POST, GET, PUT, DELETE
๋ฐ๋ฉด์ has_object_permissions ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ get_object ๋ฉ์๋๋ก ๋ถํฐ
ํธ์ถ์ด ๋๊ธฐ ๋๋ฌธ์, GET, PUT, DELETE ์๋ง ์ฌ์ฉํ ์ ์๋ค.
1
2
3
4
5
from rest_framework.permissions import BasePermission
class CustomObjectPermission(BasePermission):
def has_object_permission(self, request, view, obj):
return obj.user == request.user