1. 程式人生 > 程式設計 >Python如何實現後端自定義認證並實現多條件登陸

Python如何實現後端自定義認證並實現多條件登陸

1.須知

JWT擴充套件的登入檢視,在收到使用者名稱與密碼時,也是呼叫Django的認證系統Auth模型中提供的**authenticate()**來檢查使用者名稱與密碼是否正確。

我們可以通過修改Django認證系統的認證後端(主要是authenticate方法)來支援登入賬號既可以是使用者名稱也可以是手機號。

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

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

我們想要讓使用者既可以以使用者名稱登入,也可以以手機號登入,那麼對於authenticate方法而言,username引數即表示使用者名稱或者手機號。

重寫authenticate方法的思路:

1. 根據username引數查詢使用者User物件,username引數可能是使用者名稱,也可能是手機號
2. 若查詢到User物件,呼叫User物件的check_password方法檢查密碼是否正確

2. 新增自定義認證函式,在users/utils.py中編寫:

"""實現多條件登入"""
from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q

def get_user_by_account(account):
  """通過賬號資訊獲取使用者"""
  try:
    user = User.objects.get(Q(username=account) | Q(mobile=account) )
  except User.DoesNotExist:
    user = None
  return user

class UsernameMobileAuthBackend(ModelBackend):
  def authenticate(self,**kwargs):
    # 獲取使用者
    user = get_user_by_account(username)

    # 驗證密碼和是否允許登入
    if user is not None and user.check_password(password) and self.user_can_authenticate(user):
      return user

3.在配置檔案settings/dev.py中告知Django使用我們自定義的認證後端

AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]

在配置檔案中進行設定,就是將自定義認證函式的地址告知django認證系統

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。