首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-axes没有获得请求参数。

django-axes没有获得请求参数。
EN

Stack Overflow用户
提问于 2019-09-26 18:44:33
回答 2查看 2.2K关注 0票数 3

我最近将django-axes添加到了Django项目中。应该用django-restframework计算出这个盒子。但是,我使用django-rest-framework-simplejwt来处理身份验证。但是它仍然应该计算出这个框,因为django-axes唯一需要的东西是传递Django的身份验证方法,即请求对象,它在它的源代码(第39和43项)中这样做。

当我试图进行身份验证时,我从django-axes获得了以下错误:

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

EN

回答 2

Stack Overflow用户

发布于 2019-10-30 03:26:52

您需要向身份验证函数添加请求。参见下面的示例代码。

serializers.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from rest_framework_simplejwt.views import TokenObtainPairView
from authy.serializers import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

urls.py

代码语言:javascript
复制
from authy.views import MyTokenObtainPairView

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

还值得一提的是,简单的jwt库使用身份验证函数,但是它不传递请求参数。因此,您需要自己调用身份验证、get_token和返回数据对象。

此外,如果您已经扩展了django的AbstractBaseUser模型。并设置USERNAME_FIELD.然后使用param用户名而不是电子邮件。authenticate(username=email,password=password,request=request)

票数 2
EN

Stack Overflow用户

发布于 2021-01-28 19:27:40

用这个:

代码语言:javascript
复制
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中的AUTHENTICATION_BACKENDS,并会削弱您的安全设置。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58122960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档