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

