【问题标题】:Restrict update method to only modify request user's own data?限制更新方法只修改请求用户自己的数据?
【发布时间】:2015-10-28 20:17:47
【问题描述】:

我在 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)

我希望以更优雅的方式来做这件事,也许用装饰器之类的?

【问题讨论】:

  • 你在使用令牌认证吗?
  • 是的,我正在使用令牌身份验证

标签: python django django-rest-framework


【解决方案1】:

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

我们将首先检查它是否为update 请求。如果是,我们将使用request.user 的id 来检查url 中id 的值。如果它们不匹配,则不会授予请求访问权限,并且将返回 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

您可以通过定义permission_classes 设置将此权限类包含在您的UserViewset 中。

class UserViewSet(viewsets.ModelViewSet):

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

【讨论】:

    【解决方案2】:

    如果您使用令牌来验证您的用户,您可以使用 DRF 访问 request.user 中的当前用户,正如您在 Docs 中看到的那样。

    因此,您可以将 request.user 与 url 中传入的 id 匹配,或者仅使用 request.user 更新信息并停止通过 URL 传递 id。

    【讨论】:

    • 我完全同意,完全停止传递用户ID
    • 我可以修改它,但是在我们的客户端,我们有一个持久性模型,user 对象映射为/users/{id}/,当前用户是该对象的一个​​实例。所以出于映射目的,我们不想只使用/users/端点
    • 好吧,不过你可以忽略它,只使用request.user来更新数据。
    • @Gocht 如果管理员想要更新特定的用户信息怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2020-01-25
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多