我在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)
我希望以更优雅的方式做到这一点,也许还有装饰师或其他什么?
答案 0 :(得分:1)
如果您使用令牌对用户进行身份验证,则可以使用DRF访问request.user
中的当前用户,如Docs所示。
因此,您可以将request.user
与来自网址的传入id
进行匹配,或仅使用request.user
更新信息并停止通过网址传递id
。
答案 1 :(得分:1)
您可以创建一个CustomUpdatePermission
类,该类将根据网址中的id
和request.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
...