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',
)
posted @ 2020-08-04 10:48  Fmaj-7  阅读(224)  评论(0)    收藏  举报