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)
方案二:自定义权限类(复用性更强)
如果后续有多个视图需要相同权限逻辑,推荐自定义权限类:
- 新建
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
- 修改
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
相关产品推荐
相关产品推荐

