django使用者認證系統 自定義認證後台8

2022-05-06 10:09:06 字數 2684 閱讀 7188

django auth 應用預設支援使用者名稱(username)進行登入。但是在實踐中,**可能還需要郵箱、手機號、身份證號等進行登入,這就需要我們自己寫乙個認證後台,用於驗證使用者輸入的使用者資訊是否正確,從而對擁有正確憑據的使用者進行登入認證。

django 對使用者登入的驗證工作均在乙個被稱作認證後台(authentication backend)的類中進行。這個類是乙個普通的 python 類,它有乙個authenticate方法,接收登入使用者提供的憑據(如使用者名稱或者郵箱以及密碼)作為引數,並根據這些憑據判斷使用者是否合法(即是否是已註冊使用者,密碼是否正確等)。下面是 django 內建的認證後台的部分源**,從**中可以清晰地看到其工作方式:

django.contrib.auth.backends

class modelbackend(object):

"""authenticates against settings.auth_user_model.

""" def authenticate(self, request, username=none, password=none, **kwargs):

if username is none:

username = kwargs.get(usermodel.username_field)

try:

user = usermodel._default_manager.get_by_natural_key(username)

except usermodel.doesnotexist:

# run the default password hasher once to reduce the timing

# difference between an existing and a non-existing user (#20760).

usermodel().set_password(password)

else:

if user.check_password(password) and self.user_can_authenticate(user):

return user

這段**根據使用者傳入的 username 和 password,驗證該 username 對應的使用者是否存在以及密碼是否正確,是則返回該 user 物件。

可以定義多個認證後台,django 內部會逐一呼叫這些後台的authenticate方法來驗證使用者提供登入憑據的合法性,一旦通過某個後台的驗證,表明使用者提供的憑據合法,從而允許登入該使用者。

在本示例專案中,使用者註冊時需要填寫郵箱。因為 django auth 應用內建只支援使用者名稱和密碼的認證方式,所以目前使用者是無法使用 email 進行登入的。為了實現郵箱登入,我們需要編寫乙個認證後台。這個後台的作用便是驗證使用者提供的憑據(這裡是郵箱以及密碼)是合法的,完全仿照內建的modelbackend**即可。首先在 users 應用下新建乙個 backends.py 檔案,然後寫入如下**:

users/backends.py

from .models import user

class emailbackend(object):

def authenticate(self, request, **credentials):

# 要注意登入表單中使用者輸入的使用者名稱或者郵箱的 field 名均為 username

email = credentials.get('email', credentials.get('username'))

try:

user = user.objects.get(email=email)

except user.doesnotexist:

pass

else:

if user.check_password(credentials["password"]):

return user

def get_user(self, user_id):

"""該方法是必須的

""" try:

return user.objects.get(pk=user_id)

except user.doesnotexist:

return none

邏輯非常簡單,就是根據使用者提供的 email 和密碼,檢查該 emai 對應的使用者是否存在,如果存在則檢查密碼是否正確,如果密碼也沒有問題,則返回該 user 物件。

接下來就要告訴 django,需要使用哪些 backends 對使用者的憑據資訊進行驗證,這需要在 settings.py 中設定:

settings.py

authentication_backends = (

'django.contrib.auth.backends.modelbackend',

'users.backends.emailbackend',

)

第乙個 backend 是 django 內建的 backend,當使用者提供的是使用者名稱和正確的密碼時該 backend 會通過驗證;第二個 backend 是剛剛自定義的 backend,當使用者提供的是 email 和正確的密碼時該 backend 會通過驗證。

在登入介面輸入註冊時的郵箱和正確的密碼,可以發現也可以登入成功了,說明我們自定義的 backend 是有效的。大功告成!

使用者認證自定義

設定郵箱和使用者名稱和手機號均可登入 authentication backends users.views.custombackend class custombackend modelbackend 自定義使用者驗證規則 defauthenticate self,username none pa...

Django之部落格系統 自定義認證

前面我們在登入的時候,是通過輸入使用者名稱和密碼來進行認證 user authenticate username cd username password cd password 這個是通過後台設定的django.contrib.auth.backends.modelbackend來生效的。預設的m...

Django自帶認證系統郵件模板自定義

這幾天部署docker設定nginx遇到了郵件傳送問題 首先我的問題就是,在伺服器上部署docker之後 然後宿主機的nginx設定 server proxy pass監聽了docker內網埠 然後 使用了django自帶的認證系統 以及封裝好的django registration redux註冊...