Django REST Framework自定义对象权限不生效问题求助
排查Django REST自定义权限未生效的问题
核心原因:ViewSet未引用自定义权限类
你的UserViewSet里只配置了系统自带的IsAuthenticated权限,完全没添加自定义的UserPermissions,这就是权限代码没被加载的直接原因。修改UserViewSet的permission_classes:
# 先确保正确导入自定义权限 from .permissions import UserPermissions class UserViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ queryset = User.objects.all().order_by("-date_joined") serializer_class = UserSerializer # 把自定义权限添加到权限列表中 permission_classes = [permissions.IsAuthenticated, UserPermissions] swagger_tag = ["User"]
其他排查点
确认权限文件导入路径正确
- 检查
permissions.py是否在你的Django应用根目录下,且该应用已添加到settings.py的INSTALLED_APPS中 - 导入语句要匹配实际路径,比如如果应用名为
users,则导入应为from users.permissions import UserPermissions,避免相对路径错误
- 检查
验证权限方法的触发场景
has_object_permission仅在单个对象操作(如GET /users/1/、PUT /users/1/、DELETE /users/1/)时触发,列表接口(GET /users/)不会执行这个方法。如果要限制列表接口只能看到当前用户:- 给
UserPermissions添加has_permission方法 - 重写
UserViewSet的get_queryset过滤数据
- 给
示例代码:
# permissions.py class UserPermissions(permissions.BasePermission): def has_permission(self, request, view): # 列表接口仅允许已认证用户访问 if view.action == 'list': return request.user.is_authenticated return True def has_object_permission(self, request, view, obj): return obj == request.user # UserView.py class UserViewSet(viewsets.ModelViewSet): # ... 其他代码 def get_queryset(self): # 列表接口只返回当前用户的数据 return User.objects.filter(id=self.request.user.id).order_by("-date_joined")
- 检查全局权限配置
如果settings.py中配置了REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'],确认它不会覆盖ViewSet的局部权限配置(ViewSet的permission_classes优先级更高,但如果全局配置有冲突也需排查)
内容的提问来源于stack exchange,提问作者crevdav
相关产品推荐
相关产品推荐

