【问题标题】:Get username in a middleware from Django Rest Framework SIMPLE JWT token (3rd party)从 Django Rest Framework SIMPLE JWT 令牌(第 3 方)获取中间件中的用户名
【发布时间】:2019-07-23 13:24:33
【问题描述】:

我正在使用 Django Rest Framework,并且包含一个名为 REST framework simple JWT Auth 的第 3 方包,它是引用的新框架, 还有这个REST framework JWT Auth,是旧的(我想象一下),因为github上很久没有更新,可能不支持新版本。

我正在寻找一种方法,例如 link on stackoverflow-3rd answer,通过中间件获取每个请求的用户信息,以便在需要时使用 django 信号在我的模型中应用/保存用户对象. 我检查了文档和互联网,但我没有找到任何东西。所以,如果你已经有了这个案例,我会很感激你的帮助。

谢谢

【问题讨论】:

    标签: django django-rest-framework jwt django-rest-framework-jwt


    【解决方案1】:

    要从用户模型中获取用户名,您应该使用 request.user。这将为您提供经过身份验证的用户的请求信息。但是如果你使用simple_jwt,就不能直接在中间件中使用request.user,因为鉴权机制在view函数中起作用。

    因此,您应该在中间件中手动进行身份验证,然后您可以使用 request.user 从用户模型中获取任何数据。

    from rest_framework_simplejwt import authentication
    
    
    class MyMiddleware():
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            request.user = authentication.JWTAuthentication().authenticate(request)[0]  # Manually authenticate the token
    
            print(request.user)  # Use the request.user as you want
    

    【讨论】:

    • 赞成成为唯一真正将用户置于请求对象上的人(因此是唯一正确的答案,IMO)。但是,值得注意的是,这应该被视为一种解决方法,因为它最终导致身份验证代码被调用两次......因此最好更改代码以在实际视图中而不是在中间件中执行所需的操作。
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2020-11-02
    • 2019-08-01
    • 2018-02-24
    • 2020-01-20
    • 2020-07-23
    相关资源
    最近更新 更多