如何限制UserDetailAPIView访问权限:仅管理员与用户本人可访问
如何限制UserDetailAPIView的访问权限?
这个需求其实很常见,咱们可以通过Django REST Framework的自定义权限类来实现,具体步骤如下:
1. 自定义权限类
首先需要创建一个继承自BasePermission的权限类,重写has_object_permission方法来实现咱们的权限逻辑——仅允许管理员或用户本人访问目标对象:
from rest_framework.permissions import BasePermission, IsAuthenticated from rest_framework.views import Request, View class IsOwnerOrAdmin(BasePermission): """仅允许管理员用户或用户本人访问用户详情""" def has_object_permission(self, request: Request, view: View, obj): # 管理员用户直接放行 if request.user.is_staff: return True # 普通用户只能访问自己的信息 return obj == request.user
这里用has_object_permission而非has_permission的原因是:咱们需要针对具体的用户对象做权限判断,而不是整个视图的通用权限,这个方法会在视图获取到目标用户对象后再执行校验,逻辑更精准。
2. 给视图配置权限类
接下来,在你的UserDetailAPIView中添加permission_classes配置,结合IsAuthenticated确保访问用户已登录,再加上咱们自定义的权限类:
class UserDetailAPIView(RetrieveAPIView): """ User detail information """ queryset = User.objects.filter(is_valid=True).exclude(status=4) serializer_class = UserDetailSerializer lookup_field = "username" # 配置权限规则 permission_classes = [IsAuthenticated, IsOwnerOrAdmin]
权限逻辑说明
IsAuthenticated会先校验访问用户是否已登录,未登录用户直接返回401未授权- 已登录用户进入
IsOwnerOrAdmin的校验:- 如果是管理员(
is_staff为True),直接允许访问 - 如果是普通用户,仅当请求用户和目标用户对象是同一个人时,才允许访问,否则返回403禁止访问
- 如果是管理员(
内容的提问来源于stack exchange,提问作者fanhualuojin154873
相关产品推荐
相关产品推荐

