从Django Rest Framework SIMPLE JWT令牌(第三方)中获取中间件中的用户名

时间:2019-03-01 13:41:22

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

我正在使用Django Rest Framework,并且包含了一个名为REST framework simple JWT Auth的第三方程序包,它是所引用的新框架, 而这个REST framework JWT Auth是旧的(我想像),因为很长一段时间以来github上都没有更新,并且可能不支持较新的版本。

我正在寻找一种方法,例如link on stackoverflow-3rd answer,通过中间件来获取每个请求的用户信息,以便在需要时通过使用以下方式在我的模型中应用/保存用户对象: django信号。 我检查了文档并在Internet上找到了东西,但没有找到任何东西。因此,如果您已经遇到这种情况,我们将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:2)

那是什么阻止了你? django中间件框架很好documented。您基本上需要遵循文档,您将实现您想要的。换句话说,您需要创建一个带有请求实例的中间件。然后,您将可以通过request.user访问该用户并对其进行任何操作。

NB确保将中间件放在AuthenticationMiddleware之后。

编辑: 实际上,您无法通过django中间件获得经过身份验证的DRF用户,因为身份验证不是以“常规” django的方式完成的。 因此,一种实现方法是创建一个覆盖perform_authentication的Mixin,并在所有您的APIView-s中使用该mixin,或者您可以简单地扩展APIView并覆盖perform_authentication。

class CustomAPIView(APIView):
    def perform_authentication(self, request):
        request.user
        #Do what you like with the request.user

答案 1 :(得分:0)

要从用户模型中获取用户名,应使用request.user。这将为您提供请求中经过身份验证的用户的信息。但是,如果您使用simple_jwt,则无法在中间件中直接使用request.user,因为身份验证机制在视图功能中起作用。

因此,您应该在中间件内部进行手动身份验证,然后可以使用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