我最近将django-axes添加到了Django项目中。应该用django-restframework计算出这个盒子。但是,我使用django-rest-framework-simplejwt来处理身份验证。但是它仍然应该计算出这个框,因为django-axes唯一需要的东西是传递Django的身份验证方法,即请求对象,它在它的源代码(第39和43项)中这样做。
当我试图进行身份验证时,我从django-axes获得了以下错误:
axes.exceptions.AxesBackendRequestParameterRequired: AxesBackend需要一个请求作为参数进行身份验证。
发布于 2019-10-30 03:26:52
您需要向身份验证函数添加请求。参见下面的示例代码。
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 dataviews.py
from rest_framework_simplejwt.views import TokenObtainPairView
from authy.serializers import MyTokenObtainPairSerializer
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializerurls.py
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)
发布于 2021-01-28 19:27:40
用这个:
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://stackoverflow.com/questions/58122960
复制相似问题