【发布时间】:2016-09-20 18:13:22
【问题描述】:
我有一个包含用户和任务的基本应用程序,我希望 TaskDetails 只能由所有者访问。视图、权限和设置如下:
views.py:
from cardinal.permissions import IsOwner
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permissions_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwner)
permissions.py:
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
print("Hit IsOWnerOrReadOnly")
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
print("Hit IsOwner")
return obj.owner == request.user
class IsUser(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
print("Hit IsUser")
return obj.username == request.user.username
settings.py:
REST_FRAMEWORK = {
# 'DEFAULT_PERMISSION_CLASSES': (
# 'rest_framework.permissions.IsAuthenticated',
# 'rest_framework.permissions.IsAuthenticatedOrReadOnly',
# 'cardinal.permissions.IsOwnerOrReadOnly',
# 'cardinal.permissions.IsOwner',
# ),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
当我以“Bob”身份登录时,我可以访问“Susi”的任务并且权限不会触发。当我在设置中取消注释默认权限时,一切正常,但我不想将我写的每个权限都设置为“默认”以使其正常工作。
我查看了其他一些答案,其中一个建议在 TaskDetail 视图中覆盖 get_object 方法:
def get_object(self):
obj = get_object_or_404(self.get_queryset())
self.check_object_permissions(self.request, obj)
return obj
当我尝试这样做时,我得到了错误:
get() returned more than one Task -- it returned 7!
如何在不设置默认设置的情况下正确使用对象级权限?
更新
不知道如何或为什么,但我通过导入整个应用程序并指定完整路径让它工作。
import cardinal
class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = (cardinal.permissions.IsOwner,)
【问题讨论】:
标签: django api python-3.x permissions django-rest-framework