Django项目中基于用户组权限限制API访问的实现
Django基于用户组的API权限校验实现方案
1. 自定义GroupPermission权限类
创建继承自BasePermission的权限类,实现组权限校验逻辑:
from django.contrib.auth.models import Permission from rest_framework.permissions import BasePermission class GroupPermission(BasePermission): """校验用户所属组是否拥有访问API所需的模型权限""" def has_permission(self, request, view): user = request.user # 超级用户直接放行 if user.is_superuser: return True # 获取当前视图对应的模型 model_cls = view.queryset.model # 映射请求方法到权限后缀 permission_suffix_map = { 'GET': 'view', 'POST': 'add', 'PUT': 'change', 'PATCH': 'change', 'DELETE': 'delete' } permission_suffix = permission_suffix_map.get(request.method) if not permission_suffix: return False # 构造完整权限代码名 permission_codename = f"{permission_suffix}_{model_cls._meta.model_name}" # 查询用户所属组的所有权限 group_permissions = Permission.objects.filter(group__user=user) # 检查是否存在目标权限 return group_permissions.filter(codename=permission_codename).exists()
2. 在视图中配置权限类
确保SiteList视图正确导入并使用自定义权限类:
from rest_framework.authentication import TokenAuthentication from rest_framework.generics import ListCreateAPIView from rest_framework.permissions import IsAuthenticated from .models import Site from .serializers import SiteSerializer from .permissions import GroupPermission @authentication_classes([TokenAuthentication]) class SiteList(ListCreateAPIView): permission_classes = [IsAuthenticated, GroupPermission] queryset = Site.objects.all() serializer_class = SiteSerializer
3. 关键注意事项
- 权限自动匹配:根据请求方法自动对应模型权限(如
GET请求校验view_site,POST校验add_site) - 自定义模型兼容:你的
Users模型已通过ManyToManyField关联Group,权限类可直接适配 - 后台权限配置:需在Django管理面板中为目标用户组分配对应模型的具体权限(如
查看站点、添加站点等) - 超级用户豁免:超级用户默认跳过组权限校验,直接拥有所有API访问权限
内容的提问来源于stack exchange,提问作者Arshdeep Singh Bhatia
相关产品推荐
相关产品推荐

