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

Django Rest Framework使用SimpleJWT做JWT认证返回AnonymousUser问题

问题根因

你在StudentList视图中显式设置authentication_classes = [],该配置会覆盖settings.py中定义的全局默认JWT认证类,导致请求到达视图时不会执行JWT令牌解析逻辑,因此request.user始终为匿名用户,权限校验无法通过。

修复方案

1. 移除视图中清空认证类的配置

删除StudentList视图里的authentication_classes = []行,视图会自动继承全局配置的JWTAuthentication认证类,修改后代码如下:

class StudentList(APIView):
    permission_classes = [AdminOrTeacherOnly]

    def get(self, request, format=None):
        students = Student.objects.all()
        serializer = StudentListSerializer(students, many=True)

        if not serializer.data:
            return Response(status=status.HTTP_204_NO_CONTENT)

        return Response(serializer.data, status=status.HTTP_200_OK)

2. 优化权限类逻辑(可选)

你当前的权限类代码没有对匿名用户做前置判断,当用户未登录时调用request.user.groups.all()可能抛出异常,同时直接取首个分组判断是否为教师的逻辑兼容性较差,建议优化为如下写法:

class AdminOrTeacherOnly(permissions.BasePermission):
    """
    仅管理员或教师可以访问该视图
    """
    message = 'Only admin or teacher can edit student detail.'

    def has_permission(self, request, view):
        # 先判断用户是否已登录
        if not request.user.is_authenticated:
            return False
        is_staff = request.user.is_staff
        # 直接判断用户是否在teacher分组内,兼容多分组场景
        is_teacher_group = request.user.groups.filter(name='teacher').exists()
        return is_staff or is_teacher_group

3. 确认请求头格式正确

你当前使用的Authorization: Bearer <access_token>请求头格式符合SimpleJWT的默认要求,无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:02