Изменение пользователя по умолчанию при использовании REST-фреймворка JWT

У меня есть проксированная модель пользователя:

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

И я использую Django REST framework JWT, чтобы сделать JWT auth в REST API.

Я хотел бы получить объект пользователя из запроса, но в настоящее время это объект User. Поскольку он проксируется, я не могу использовать AUTH_USER_MODEL. Я пытался сделать компонент промежуточного ПО, чтобы переопределить пользователя в запросе, но он не установлен на этом этапе. Я также пробовал использовать JWT_RESPONSE_PAYLOAD_HANDLER, но моя функция не вызывается, поэтому я не могу установить его и там.

Если я хочу иметь возможность получать объект TheDude при вызове request.user вместо User в моих представлениях, как мне это сделать при аутентификации с помощью библиотеки REST framework JWT Auth?

Должна быть возможность использовать прокси-модель, переопределив класс аутентификации JWTAuthentication и установив вашу прокси-модель пользователя в качестве 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, затем вы можете применить этот пользовательский класс аутентификации как один из классов аутентификации по умолчанию в настройках REST_FRAMEWORK:

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

Или просто примените его к определенным видам, которые вы хотите:

from myapp.authentication import MyCustomJWTAuthentication


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

Это в свою очередь должно дать вам request.user, который является TheDude экземпляром.

Вернуться на верх