You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:24:54