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

DRF自定义认证类中request.user被覆盖问题求助

问题根源

你的问题出在DRF自定义认证类的authenticate方法返回值规则上:DRF会自动把这个方法返回的第一个元组元素赋值给request.user,第二个元素赋值给request.auth,不管你之前手动给request.user设了什么值。

看你企业Token认证的分支:

if business_token is not None:
    business = business_token.business
    request.business = business
    user = business.owner
    request.user = user
    return business, None  # 这里返回的第一个元素是business,DRF会把它覆盖到request.user上

你手动设置了request.user = user,但最后返回的是business, None,DRF会立刻把request.user替换成business,这就是为什么你看到request.user变成了企业对象。

修复方案

调整返回值,把business.owner作为第一个返回值,同时把business作为第二个返回值(或者保留request.business的设置),这样DRF就会正确把用户赋值给request.user,同时你可以通过request.auth或者request.business拿到企业对象。

修正后的代码:

from business.models import BusinessToken
from rest_framework.authtoken.models import Token
from rest_framework import authentication, exceptions


class AuthenticationMixin(authentication.BaseAuthentication):
    def authenticate(self, request):
        raw_token = request.META.get('HTTP_AUTHORIZATION')

        if not raw_token:
            return None

        token_key = raw_token.replace("Token ", "")

        user_token = Token.objects.filter(key=token_key).first()

        if user_token is not None:
            user = user_token.user
            return user, None  # DRF自动设置request.user=user

        business_token = BusinessToken.objects.filter(key=token_key).first()

        if business_token is not None:
            business = business_token.business
            user = business.owner
            
            # 手动给request添加business属性
            request.business = business
            # 返回(user, business),DRF自动设置request.user=user,request.auth=business
            return user, business
            
        raise exceptions.AuthenticationFailed('No such user or business')
额外说明
  • 不需要手动给request.user赋值,DRF会根据返回的第一个元素自动设置,手动赋值是多余的(而且会被返回值覆盖)。
  • 现在在视图里,你可以通过request.user拿到企业的所有者,通过request.business或者request.auth拿到对应的企业对象,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:14:57