1. 程式人生 > >支援使用者名稱與手機號均可作為登入賬號

支援使用者名稱與手機號均可作為登入賬號

後端實現原理:

jwt擴充套件的登陸檢視在收到使用者名稱和密碼時,呼叫django的認證系統中提供的authenticate()檢查使用者名稱和密碼是否正確。所以繼承django.contrib.auth.backends.ModelBackend 並重寫authenticate()。

authenticate(self, request, username=None, password=None, **kwargs)方法的引數說明:

  • request 本次認證的請求物件
  • username 本次認證提供的使用者賬號
  • password 本次認證提供的密碼

重寫authenticate方法的思路:

  1. 根據username引數查詢使用者User物件,username引數可能是使用者名稱,也可能是手機號
  2. 若查詢到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',
]