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

DRF自定义Token认证报错:User_Auth无is_authenticated属性求助

解决DRF自定义Token认证中'User_Auth' object has no attribute 'is_authenticated'错误

这个报错的核心原因很明确:DRF的IsAuthenticated权限类会检查认证后返回的用户对象是否具备is_authenticated属性,但你当前返回的是User_Auth实例——它是关联用户的认证凭证模型,并非Django的用户模型本身,所以没有这个属性。

解决方案步骤

DRF要求自定义认证类的authenticate方法必须返回一个二元组(user, auth):

  • user:必须是Django用户模型的实例(或继承自AbstractUser/AbstractBaseUser的自定义用户模型),这类对象自带is_authenticated属性
  • auth:可以是你的User_Auth实例,作为认证凭证对象

1. 修改authentication.py中的authenticate方法

假设你的User_Auth模型通过外键user_master关联到User_Master用户模型,修改代码如下:

from rest_framework.authentication import TokenAuthentication
from rest_framework import exceptions
from .models import User_Auth

class UserAuthentication(TokenAuthentication):
    def authenticate(self, request):
        # 从请求头获取Token(注意这里不需要前缀,因为你的请求头直接传Token值)
        auth_header = request.headers.get('Authorization')
        if not auth_header:
            return None
        
        try:
            token = auth_header.strip()
            # 查询对应的User_Auth记录
            user_auth = User_Auth.objects.get(secret_token=token)
            # 返回关联的用户模型实例 + User_Auth实例
            return (user_auth.user_master, user_auth)
        except User_Auth.DoesNotExist:
            raise exceptions.AuthenticationFailed("无效的Token")

2. 确保你的用户模型具备is_authenticated属性

如果User_Master是自定义用户模型,必须继承Django的用户基类:

# models.py
from django.contrib.auth.models import AbstractUser

class User_Master(AbstractUser):
    # 你的自定义字段
    pass

同时在settings.py中配置自定义用户模型:

AUTH_USER_MODEL = "your_app_name.User_Master"

3. 验证视图集配置

你的视图集配置是正确的,保持即可:

# views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticated
from .authentication import UserAuthentication
from .models import YourModel
from .serializers import YourSerializer

class YourModelViewSet(ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourSerializer
    authentication_classes = [UserAuthentication]
    permission_classes = [IsAuthenticated]

为什么这样修改?

当DRF执行权限检查时,IsAuthenticated会调用返回的user对象的is_authenticated属性——Django的用户模型(包括自定义的)默认就有这个属性(返回True表示用户已认证)。而我们返回的user_auth作为认证凭证,会被DRF存储在request.auth中,方便后续业务使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:21:34