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', ]