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
相关产品推荐
相关产品推荐

