Django Rest-framework JWT认证获取用户信息报'authenticate'属性不存在如何解决
问题根源
你混淆了 Django REST Framework 中两个配置项的作用:
authentication_classes是认证类配置项,用于指定校验用户身份的逻辑类,执行时会调用类的authenticate方法IsAuthenticated属于权限控制类,作用是判断已经完成身份校验的用户是否有访问接口的权限,本身没有authenticate方法
你把权限类错放到了认证类的配置数组里,所以触发了属性不存在的报错。
修复方案
两种修改方式二选一即可:
方式1:仅为当前ViewSet配置权限(推荐,灵活度更高)
将UserViewSet中的authentication_classes修改为permission_classes即可:
class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer # 将原authentication_classes替换为permission_classes permission_classes = [IsAuthenticated,]
你已经在全局配置了默认的JWT认证类,所以ViewSet不需要重复配置认证类。
方式2:全局配置默认权限规则
如果你的项目所有接口都需要登录后才能访问,可以直接在全局REST_FRAMEWORK配置中增加默认权限规则,不需要每个ViewSet单独配置:
REST_FRAMEWORK = { 'NONE_FIELD_ERRORS_KEY':'error', 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), # 新增默认权限配置 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
这种配置下UserViewSet不需要单独加任何认证、权限相关的配置也会自动生效。
接口测试注意事项
Postman请求接口时,需要在请求头中携带认证信息:
- 请求头key:
Authorization - 请求头value:
Bearer <你登录接口返回的access_token值>
内容的提问来源于stack exchange,提问作者Chen Triều
相关产品推荐
相关产品推荐

