jwt扩展的登录视图在收到用户名和密码时,调用django的认证系统中提供的authenticate()检查用户名和密码是否正确。因此继承django.contrib.auth.backends.ModelBackend 并重写authenticate()。django
authenticate(self, request, username=None, password=None, **kwargs)
方法的参数说明:后端
重写authenticate方法的思路:spa
在users/utils.py中编写:code
def get_user_by_account(account): """ 根据账号获取user对象 :param account: 帐号,能够是用户名,也能够是手机号 :return: User对象 或者 None """ try: if re.match('^1[3-9]\d{9}$', account): # 账号为手机号 user = User.objects.get(mobile=account) else: # 账号为用户名 user = User.objects.get(username=account) except User.DoesNotExist: return None else: return user class UsernameMobileAuthBackend(ModelBackend): """ 自定义用户名或手机号认证 """ def authenticate(self, request, username=None, password=None, **kwargs): user = get_user_by_account(username) if user is not None and user.check_password(password): return user
在配置文件中告知Django使用咱们自定义的认证后端jwt
AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthBackend', ]