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

