限制更新方法只修改请求用户自己的数据?

时间:2015-10-28 20:17:48

标签: python django django-rest-framework

我在DRF中有一个Update方法,允许用户更新自己的个人资料。 api端点是PUT /api/users/{id}/,其中id是他自己的用户ID。如果他尝试更新任何其他用户个人资料,他将收到HTTP403。

我现在这样做的方式是

def update(self, request, *args, **kwargs):
    """
    Update user profile
    """
    if int(kwargs['id']) is not request.user.id:
        return Response({}, status=status.HTTP_403_FORBIDDEN)
    return super(UserViewSet, self).update(request, *args, **kwargs)

我希望以更优雅的方式做到这一点,也许还有装饰师或其他什么?

2 个答案:

答案 0 :(得分:1)

如果您使用令牌对用户进行身份验证,则可以使用DRF访问request.user中的当前用户,如Docs所示。

因此,您可以将request.user与来自网址的传入id进行匹配,或仅使用request.user更新信息并停止通过网址传递id

答案 1 :(得分:1)

您可以创建一个CustomUpdatePermission类,该类将根据网址中的idrequest.user.id是否匹配来授予对更新请求的访问权限。

我们首先检查它是否为update请求。如果是,我们将使用id id检查网址中request.user的值。如果它们不匹配,则不会授予请求访问权限,并且将返回403 Forbidden响应。

from rest_framework import permissions

class CustomUpdatePermission(permissions.BasePermission):
    """
    Permission class to check that a user can update his own resource only
    """

    def has_permission(self, request, view):
        # check that its an update request and user is modifying his resource only
        if view.action == 'update' and view.kwargs['id']!=request.user.id:
            return False # not grant access
        return True # grant access otherwise

您可以通过定义UserViewset设置在permission_classes中添加此权限类。

class UserViewSet(viewsets.ModelViewSet):

    permission_classes = (CustomUpdatePermission,) # specify custom permission class here
    ...