如何在Django Rest Framework中基于用户组配置视图权限?
解决Django Rest Framework中特定用户组访问视图的问题
先梳理你之前三种方法的核心错误:
- 方法一:使用Django原生
permission_required装饰器时,未传入完整权限格式(需为{app_label}.{permission_codename}),且该装饰器适配原生Django请求,与DRF的Request对象兼容不佳。 - 方法二:自定义权限类中
request.user.is_customer逻辑错误(未给User模型添加该字段),且错误地将DRF权限类传给了Django原生装饰器,二者不兼容。 - 方法三:
permission_classes装饰器需传入权限类的列表,而非字符串,字符串无法被DRF识别为有效权限逻辑。
正确实现方式
根据你的场景(默认权限为IsAdminUser,需开放特定视图给customers组/拥有is_customer权限的用户),推荐两种方案:
方案1:自定义权限类,检查用户是否拥有指定权限
from rest_framework import permissions from rest_framework.decorators import api_view, permission_classes class IsCustomer(permissions.BasePermission): def has_permission(self, request, view): # 传入完整权限标识:app名称.权限codename # 若权限创建在自定义app下,替换auth为你的app名称 return request.user.has_perm('auth.is_customer') @api_view(["POST"]) # 覆盖默认权限,使用自定义权限类 @permission_classes([IsCustomer]) def my_func(request): # calculations return Response(...)
方案2:自定义权限类,检查用户是否属于指定组
如果希望直接校验用户所在组:
from rest_framework import permissions from rest_framework.decorators import api_view, permission_classes class IsInCustomerGroup(permissions.BasePermission): def has_permission(self, request, view): # 检查用户是否在customers组内 return request.user.groups.filter(name='customers').exists() @api_view(["POST"]) @permission_classes([IsInCustomerGroup]) def my_func(request): # calculations return Response(...)
补充:多权限组合
若需同时允许管理员和客户访问,可组合权限类:
@permission_classes([permissions.IsAdminUser | IsCustomer])
内容的提问来源于stack exchange,提问作者WhoDatBoy
相关产品推荐
相关产品推荐

