首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DjangoRestFramework - has_permission错误地覆盖了has_object_permission

DjangoRestFramework - has_permission错误地覆盖了has_object_permission
EN

Stack Overflow用户
提问于 2015-11-03 08:32:34
回答 1查看 379关注 0票数 2

这是我的权限:

代码语言:javascript
运行
复制
class IsCreationOrAuthenticatedOrIsOwnerOrWatchOrReadOnly(permissions.BasePermission):
    """
    Allow only the owner (and admin) of the object to make changes (i.e.
    do PUT, PATCH, DELETE and POST requests. Allow all other users
    ReadOnly or Follow options. This is for UserViewSet. Allow unauthenticated users to
    create objects.
    """

    def has_permission(self, request, view):
        if not request.user.is_authenticated():
            if view.action == 'create':
                return True
            return False

        return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow'

    def has_object_permission(self, request, view, obj):

        if not request.user.is_authenticated():
            return False

        if request.method in permissions.SAFE_METHODS:
            return True

        if request.user.is_staff:
            return True

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

        return obj.owner == request.user

问题是,经过身份验证的用户无法放置、修补或删除自己的帐户,因为在has_permission中它写道:

代码语言:javascript
运行
复制
return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow'

然而,PUT、PATCH和DELETE在这里取决于是否为obj.owner == request.user (它取决于对象)。那么,当has_permission没有访问object的权限,因此不允许任何PUT、PATCH和DELETE时,我如何才能允许用户只放置、修补和删除他们的帐户(因为这完全取决于obj.owner == request.user是否。

EN

回答 1

Stack Overflow用户

发布于 2015-11-04 19:54:39

为什么不禁用has_permissions并修改has_object_permission来检查POST呢?

代码语言:javascript
运行
复制
def has_object_permission(self, request, view, obj):

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

    if not request.user.is_authenticated():
        return False

    if request.method in permissions.SAFE_METHODS:
        return True

    if request.user.is_staff:
        return True

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

    return obj.owner == request.user
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33489516

复制
相关文章

相似问题

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