【问题标题】:django-axes is not getting the request argumentdjango-axes 没有得到请求参数
【发布时间】:2019-09-26 18:44:33
【问题描述】:

我最近将django-axes 添加到我的 Django 项目中。假设使用django-restframework 解决问题。但是,我使用django-rest-framework-simplejwt 来处理身份验证。但它应该仍然可以解决问题,因为django-axes 唯一需要的就是将 Django 的身份验证方法传递给它在其源代码中执行的请求对象(line 39 and 43)。

当我尝试进行身份验证时,我从django-axes 收到此错误:

axes.exceptions.AxesBackendRequestParameterRequired:AxesBackend 需要请求作为参数来进行身份验证

【问题讨论】:

    标签: django django-rest-framework django-rest-framework-simplejwt


    【解决方案1】:

    您需要向身份验证功能添加请求。请参阅下面的示例代码。

    serializers.py

    from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
    
    class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    
        def _authenticate_user_email(self, email, password, request):
    
            # This is key: Pass request to the authenticate function
            self.user = authenticate(email=email, password=password, request=request)
            return self.user
    
        def validate(self, attrs):
    
            password = attrs.get('password')
            email = attrs.get('email')
            request = self.context.get('request')   # <<=== Grab request
    
            self.user = self._authenticate_user_email(email, password, request)
    
            # All error handling should be done by this code line 
    
            refresh = self.get_token(self.user)
    
            data = {}
            data['refresh'] = str(refresh)
            data['access'] = str(refresh.access_token)
    
            return data
    

    views.py

    from rest_framework_simplejwt.views import TokenObtainPairView
    from authy.serializers import MyTokenObtainPairSerializer
    
    class MyTokenObtainPairView(TokenObtainPairView):
        serializer_class = MyTokenObtainPairSerializer
    

    urls.py

    from authy.views import MyTokenObtainPairView
    
    url(r'^/auth/api/token/$', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
    

    还值得一提的是,简单的 jwt lib 使用 authenticate 功能,但是它不传递请求参数。因此需要自己调用authenticate、get_token并返回数据对象。

    另外,如果你扩展了 django 的 AbstractBaseUser 模型。并设置 USERNAME_FIELD。然后使用参数用户名而不是电子邮件。例如:身份验证用户名=电子邮件,密码=密码,请求=请求)

    【讨论】:

    • 为我工作。谢谢stackoverflow.com/users/1082673/lukik!我添加了一些我在自己修复此问题时发现缺失的细节。
    • 感谢您提供更多详细信息。它使示例更加完整。
    【解决方案2】:

    使用这个:

    from axes.backends import AxesBackend
    
    
    class MyBackend(AxesBackend)
        def authenticate(self, request=None, *args, **kwargs):
            if request:
                return super().authenticate(request, *args, **kwargs)
    

    如果请求未设置,这将跳过 AUTHENTICATION_BACKENDS 中的 AxesBackend,并且会削弱您的安全设置。

    来源:https://github.com/jazzband/django-axes/issues/478

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2021-05-03
      • 2019-02-17
      • 2017-04-04
      相关资源
      最近更新 更多