支持用戶名與手機號都可做爲登陸帳號

後端實現原理:

jwt擴展的登錄視圖在收到用戶名和密碼時,調用django的認證系統中提供的authenticate()檢查用戶名和密碼是否正確。因此繼承django.contrib.auth.backends.ModelBackend 並重寫authenticate()。django

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

  • request 本次認證的請求對象
  • username 本次認證提供的用戶帳號
  • password 本次認證提供的密碼

重寫authenticate方法的思路:spa

  1. 根據username參數查找用戶User對象,username參數多是用戶名,也多是手機號
  2. 若查找到User對象,調用User對象的check_password方法檢查密碼是否正確

在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', ]
相關文章
相關標籤/搜索