首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DjangoRestFramework -如何正确分离has_permission和has_object_permission

DjangoRestFramework -如何正确分离has_permission和has_object_permission
EN

Stack Overflow用户
提问于 2015-11-01 23:30:02
回答 1查看 632关注 0票数 0

这是我的许可课程:

代码语言:javascript
运行
复制
class IsCreationOrFollowOrOwnerOrReadOnly(permissions.BasePermission):
    """
    Allow any users to create, get and follow objects. Allow only owners to
    PUT, PATCH and DELETE.
    """
    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS or request.user.is_staff:
            return True

        if view.action == 'create':
            return True

        return False

    def has_object_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow':
            return True

        try:
            return obj.owner == request.user
        except:
            return obj == request.user # If obj Is request.user

要跟踪对象,必须使用follow操作。这是我的观点集:

代码语言:javascript
运行
复制
class {ageViewSet(viewsets.ModelViewSet):
    queryset = Page.objects.all()
    serializer_class = PageSerializer
    permission_classes = (IsAuthenticated, IsCreationOrFollowOrOwnerOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user, location=self.request.user.userextended.location)

    @detail_route(methods=['post'])
    def follow(self, request, pk=None):
        page = self.get_object()    

        page.users.add(request.user)

        return Response(status=status.HTTP_204_NO_CONTENT)

问题是,当我试图跟踪一个对象时,它会给我一个403_FORBIDDEN状态代码。我假设这是因为在has_permission中,我必须添加以下一行:

代码语言:javascript
运行
复制
if view.action=='follow':
    return True

但是,即使我添加了这一行,当所有者尝试将其放入自己的对象时也会出现403_FORBIDDEN错误(这可能是因为在我的has_permission方法中,我没有if view.action == 'update': return True,但是PUT、修补程序和DELETE都取决于对象本身(if obj.owner == request.user),所以如何正确地只允许用户放置、修补和删除对象,同时允许任何用户跟踪对象(跟踪也是一个对象级别的权限,所以在has_permission中放置这个权限对我来说没有意义,因为它与对象有关)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-02 07:36:24

您不需要覆盖has_permission。只需重写has_object_permission并执行以下操作:

代码语言:javascript
运行
复制
def has_object_permission(self, request, view, obj):
    if request.method in permissions.SAFE_METHODS or request.user.is_staff or obj.owner == request.user:
        return True

    if request.method=='POST':
        return True

    return False

这样,业主和工作人员就可以执行任何操作。但用户只能获取、发布和跟踪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33468455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档