使用 REST framework JWT 时更改默认用户

Changing the default user while using REST framework JWT

我有一个代理用户模型:

class TheDude(User):
    class Meta:
        proxy = True

我正在使用 Django REST 框架 JWT 在 REST 中进行 JWT 身份验证 API。

我想从请求中获取用户对象,但目前它是一个用户对象。因为它是代理我不能使用 AUTH_USER_MODEL。我试过做一个中间件组件来覆盖请求中的用户,但它没有在那个阶段设置。我也试过使用 JWT_RESPONSE_PAYLOAD_HANDLER 但是我的函数没有被调用所以我也不能在那里设置它。

如果我想在我调用 request.user 而不是 User 时获得 TheDude 对象,我将如何在使用 REST 框架 JWT 进行授权时执行此操作授权库?

编辑

我已经添加了

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'myapp.authentication.MyCustomJWTAuthentication',
    )
    ...
}

我的settings.py和我的

class MyCustomJWTAuthentication(JWTAuthentication):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_model = TheDude

调用正确,但是当我从序列化程序中的请求中获取用户时,它仍然是 User 类型,而不是 TheDude

class TestSerializer(serializers.ModelSerializer):

    user_test = serializers.SerializerMethodField('get_user_test')

    def get_user_test(self, obj):
        print(type(self.context['request'].user))

应该可以通过覆盖 JWTAuthentication 身份验证 class 并将代理用户模型设置为 user_model 来使用代理模型,如下所示:

from rest_framework_simplejwt.authentication import JWTAuthentication


class MyCustomJWTAuthentication(JWTAuthentication):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_model = TheDude

假设您在 myapp/authentication.py 上添加此 class,然后您可以将此自定义身份验证 class 作为默认身份验证 class 之一应用到您的 [=16] =] 设置:

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'myapp.authentication.MyCustomJWTAuthentication',
        ...
        
    )
    ...
}

或者仅将其应用于您想要的某些视图:

from myapp.authentication import MyCustomJWTAuthentication


class CertainAPIViewThatNeedsTheDude(APIView):
    authentication_classes = (MyCustomJWTAuthentication, )

这应该反过来给你一个 request.user 是一个 TheDude 实例。