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

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"]

其他排查点

  1. 确认权限文件导入路径正确

    • 检查permissions.py是否在你的Django应用根目录下,且该应用已添加到settings.py的INSTALLED_APPS中
    • 导入语句要匹配实际路径,比如如果应用名为users,则导入应为from users.permissions import UserPermissions,避免相对路径错误
  2. 验证权限方法的触发场景
    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")
  1. 检查全局权限配置
    如果settings.py中配置了REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'],确认它不会覆盖ViewSet的局部权限配置(ViewSet的permission_classes优先级更高,但如果全局配置有冲突也需排查)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:01:04