django重写authcenticate方法兼容用户、邮箱、密码认证登录
1 from django.contrib.auth.backends import ModelBackend 2 from django.contrib.auth import get_user_model 3 from django.db.models import Q 4 5 UserModel = get_user_model() 6 7 class CustomBackend(ModelBackend): 8 '''手机、邮箱、用户三式登录认证''' 9 def authenticate(self, request, username=None, password=None, **kwargs): 10 '''重写authenticate''' 11 username = request.POST.get('userid') 12 password = request.POST.get('pwd') 13 if username is None: 14 username = kwargs.get(UserModel.USERNAME_FIELD) 15 try: 16 # user = UserModel._default_manager.get_by_natural_key(username) #用户登录 17 user = UserModel._default_manager.filter(Q(username=username) | Q(mobile=username) | Q(email=username)).first() #兼容登录 18 except UserModel.DoesNotExist: 19 # Run the default password hasher once to reduce the timing 20 # difference between an existing and a non-existing user (#20760). 21 UserModel().set_password(password) 22 else: 23 if user.check_password(password) and self.user_can_authenticate(user): 24 return user
settings.py配置:
AUTHENTICATION_BACKENDS = (
'user.custom.CustomBackend',
)