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

Django REST Framework:为GET请求实现授权用户访问限制

实现GET请求的供应商权限控制

你已经在CreateSupplierSerializer的update方法中实现了「仅当前认证用户可修改自己的供应商数据」的权限校验,现在要在GET请求中实现相同逻辑,确保用户只能查看自己的供应商信息,无法访问其他用户的资源,可通过以下两种方式实现:

方案一:直接在视图中重写方法(快速实现)

修改views.py中的getsuppliers视图,通过重写get_queryset限制列表查询范围,同时在retrieve方法中添加权限校验:

from rest_framework import exceptions

class getsuppliers(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = GetSuppliersSerializer
    lookup_field = 'username'

    def get_queryset(self):
        # 列表接口仅返回当前认证用户的供应商数据
        return User.objects.filter(username=self.request.user.username)
    
    def retrieve(self, request, *args, **kwargs):
        # 详情接口校验:确保要访问的用户是当前认证用户
        instance = self.get_object()
        if instance.username != request.user.username:
            raise exceptions.PermissionDenied('你没有权限查看该供应商数据')
        return super().retrieve(request, *args, **kwargs)

方案二:自定义权限类(复用性更强)

如果后续有多个视图需要相同权限逻辑,推荐自定义权限类:

  1. 新建permissions.py文件,编写权限校验逻辑:
from rest_framework import permissions

class IsSupplierOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # 校验当前用户是否是目标资源的所有者
        return obj.username == request.user.username
  1. 修改views.py,应用权限类并限制查询集:
from .permissions import IsSupplierOwner

class getsuppliers(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = GetSuppliersSerializer
    lookup_field = 'username'
    # 绑定自定义权限类
    permission_classes = [IsSupplierOwner]

    def get_queryset(self):
        # 列表接口仅返回当前用户的数据
        return User.objects.filter(username=self.request.user.username)

关键说明

  • 两种方案都能实现核心需求:用户只能查看自己的供应商数据,访问其他用户资源时会返回权限拒绝。
  • 重写get_queryset是为了避免列表接口返回所有用户的供应商信息,确保列表页只显示当前用户的数据。
  • 需确保请求已通过DRF的认证(如TokenAuthentication或SessionAuthentication),否则request.user会是匿名用户,权限校验会失效。

内容的提问来源于stack exchange,提问作者Kyle Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:45:31