在我的Django应用程序中,我使用REST_FRAMETER创建了一个定制的身份验证类:

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
            request.user = user

            return user, None

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

        if business_token is not None:
            business = business_token.business

            request.business = business

            user = business.owner

            request.user = user

            return business, None
        raise exceptions.AuthenticationFailed('No such user or business')

如您所见,该类必须基于来自http请求的令牌传递对用户或企业进行身份验证.

如果用户通过API视图中的业务令牌进行身份验证,我必须以business.owner的身份访问request.user,并以业务的身份请求.Business,但request.user被设置为业务,它在某个地方被覆盖.

推荐答案

二元组的第一项是用户,Django将使用它来设置用户.通过返回business,您可以将其设置为request.user.因此,您应该返回企业主,并设置(仅限)request.business:

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

        if not raw_token:
            return None, None

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

        try:
            user_token = Token.objects.select_related('user').get(key=token_key)
            user = user_token.user
            return user, None
        except Token.DoesNotExist:
            pass
        try:
            business_token = BusinessToken.objects.select_related(
                'business__owner'
            ).get(key=token_key)
            business = business_token.business
            request.business = business
            return business.owner, None
        except BusinessToken.DoesNotExist:
            raise exceptions.AuthenticationFailed('No such user or business')

Django相关问答推荐

如何在Django REST框架中使用FactoryBoy创建不同的项目

如何从列中捕获数据并将其添加到下拉菜单中,以便表单填充另一个表

基于Django类的视图:除非登录,否则拒绝访问future 日期

如何删除Docker上的django应用程序?

Django-admin 显示decorator 按多列排序

如何使更新记录在 Django 模型中传递信号?

如何创建复杂的查询?| ChartJS 和 Django

如何在Django模板中有条件地传递值给with变量?

Django中的InvalidOperation错误[]

如何使用来自另一个字段的信息创建字段

如何在 Django 模板视图中显示我的数据?

Django ORM:获取每个类别的月平均价格

防止 django 将_id附加到外键字段

TestCase 类中的 setUpClass、setUpTestData 和 setUp 有什么区别?

模型中的外键

RemovedInDjango18Warning:不推荐创建没有fields属性或 exclude属性的 ModelForm

在 Django REST 框架序列化程序中动态排除或包含字段

使用 request.user 的 Django 和中间件始终是匿名的

如何获取 pytz 时区的通用名称

Django 中的 Python 日志(log)记录