支援使用者名稱與手機號均可作為登入賬號
阿新 • • 發佈:2018-11-21
後端實現原理:
jwt擴充套件的登陸檢視在收到使用者名稱和密碼時,呼叫django的認證系統中提供的authenticate()檢查使用者名稱和密碼是否正確。所以繼承django.contrib.auth.backends.ModelBackend 並重寫authenticate()。
authenticate(self, request, username=None, password=None, **kwargs)
方法的引數說明:
- request 本次認證的請求物件
- username 本次認證提供的使用者賬號
- password 本次認證提供的密碼
重寫authenticate方法的思路:
- 根據username引數查詢使用者User物件,username引數可能是使用者名稱,也可能是手機號
- 若查詢到User物件,呼叫User物件的check_password方法檢查密碼是否正確
在users/utils.py中編寫:
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使用我們自定義的認證後端
AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthBackend', ]