正常情况下,系统的方法只校验了用户名和密码,如果在登陆过程中,支持手机号登陆,那么这种校验就会失败,所以需要自定义认证方法。
1、新建一个类,继承 ModelBackend
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from rest_framework import serializers
from vueshop.models import UserInfo
# 1, 重写系统认证方法
class MyModelBackend(ModelBackend):
'''默认系统只校验用户名和密码,实际情况,可能有手机号,验证码等其他需要校验的'''
def authenticate(self, request, username=None, password=None, **kwargs):
# print(request.data)
try:
try:
# 1、检查用户名,添加了用手机号登陆
user = UserInfo.objects.get(Q(username=username) | Q(mobile=username))
except Exception as e:
raise serializers.ValidationError({'msg': '用户名和手机号未查询到数据,请确认?'})
# 2, 校验密码
if user.check_password(password):
return user
else:
# 如果不想密码登录也可以验证码在这里写
# 这里做验证码的操作
raise serializers.ValidationError({'msg': '密码错误'})
except Exception as e:
raise e
2、配置settings.py
AUTHENTICATION_BACKENDS = ['utils.my_authenticate.MyModelBackend']
3、路由配置
path('login2/', views.Login2View.as_view()),
4、视图
视图这里看不懂的参考前面的文章
class Login2View(TokenObtainPairView):
serializer_class = MyTokenSerializer
5、验证
username=用户名和password=密码可以正常返回响应,图一
username=手机号和password=密码可以正常返回响应,图二
用户名或者密码错误,返回相应的数据,图三