【问题标题】:Trying to restrict editing of an object to the object's owner or is_staff in Django Rest Framework试图将对象的编辑限制为对象的所有者或 Django Rest Framework 中的 is_staff
【发布时间】:2014-08-23 17:51:21
【问题描述】:

我快到了,但我不太明白。

我有一个自定义权限设置:

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsOwnerOrStaff(BasePermission):
    def has_permission(self, request, view):
        return view.action == 'retrieve' or request.user.is_staff

    def has_object_permission(self, request, view, obj):
        if request.method in SAFE_METHODS:
            return True

        return request.user.is_staff or obj == request.user

还有一个这样做的用户视图:

from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework import permissions

from .serializers import UserSerializer
from .permissions import IsOwnerOrStaff

class ViewMixins(object):
    permission_classes = (permissions.IsAuthenticated, IsOwnerOrStaff,)

class UserViewSet(ViewMixins, viewsets.ModelViewSet):
    serializer_class = UserSerializer
    model = User

request.user.is_staff 并且对非员工用户有权限控制时,一切都有效。但是,NOT 员工用户不能对自己的记录执行任何操作,只能查看它。

我认为if request.method in SAFE_METHODS 会允许它通过,但我似乎遗漏了一些东西。

欢迎提出建议。

顺便说一句:我希望 user.is_staff 能够做任何事情,而不是员工的用户只能在他们的 OWN 记录上进行 GET/PUT/PATCH/POST。

谢谢!

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    这比您尝试的更容易。覆盖视图的 get_queryset 方法:

    如果 self.request.user.is_superuser: 返回模型.objects.all() 别的: return Model.objects.filter(owner=self.request.user)

    ofc,您的模型中需要一个指向创建者/所有者的字段。

    更多信息Django-rest-framework permissions for create in viewset

    【讨论】:

    • 好吧,现在我很困惑。那太容易了。那我为什么还要写自定义权限呢?
    • 用于高级过滤。例如,如果您必须控制用户在创建涉及蔬菜的收据时是否具有 add_vegetables 权限(只是说一下)。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2016-09-19
    相关资源
    最近更新 更多