【问题标题】:Changing the default user while using REST framework JWT使用 REST 框架 JWT 时更改默认用户
【发布时间】:2021-10-21 01:47:49
【问题描述】:

我有一个代理用户模型:

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

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

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

如果我希望在我的视图中调用request.user 而不是User 时能够获得TheDude 对象,我将如何在使用REST 框架JWT Auth 库进行身份验证时执行此操作?

编辑

我已经添加了

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))

【问题讨论】:

    标签: python python-3.x django django-rest-framework django-rest-framework-jwt


    【解决方案1】:

    应该可以通过覆盖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实例。

    【讨论】:

    • 我使用的是 djangorestframework-jwt 而不是 djangorestframework-simplejwt,但我会考虑移动。我会看看是否可以将您的答案修改到不同的库中。
    • 我明白了。该软件包似乎没有维护,并且使用了相当旧的 django 版本。不管怎样,你可以用authenticate_credentials 做同样的事情
    • 我想我会考虑将它转移到一个维护的包中。不幸的是,我继承了这个应用程序。
    • 我已经移动了 auth 库并实现了这段代码,但是当我执行 self.context['request'].user 时,我仍然在我的序列化程序中获得 User 对象
    • 你能用最新的变化更新你的问题吗?也与当前设置
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2020-10-21
    • 2017-01-26
    • 1970-01-01
    • 2019-07-11
    • 2018-02-06
    • 2018-02-07
    • 2015-10-19
    相关资源
    最近更新 更多