Python如何實現後端自定義認證並實現多條件登陸
阿新 • • 發佈:2020-06-22
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認證系統
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。