Django通過自定義認證后端實現(xiàn)多種登錄方式驗證
前言
我們見到幾乎所有的 Web 網(wǎng)站或者手機 App 也好,它們的最終目的都是要留住用戶,提升自己網(wǎng)站的用戶注冊量,所以說用戶的概念也必須深入到每一個程序開發(fā)者的心中。而權(quán)限呢?它限制了用戶可以擁有哪些功能,比如說某項只有付費會員才可以觀看的教程,這就用到了用戶的權(quán)限設(shè)置,可以一言一概之,用戶的實現(xiàn)業(yè)務(wù)系統(tǒng)中的數(shù)據(jù)隔離,而權(quán)限則限定了用戶可以使用的哪些功能。
那么,Django 提供的用戶認證系統(tǒng)如何在項目中進行應(yīng)用呢?在本節(jié)我們將給大家介紹如何使用用戶認證系統(tǒng),實現(xiàn)我們業(yè)務(wù)場景中常見的多種登錄方式驗證。這里就用到了自定義認證后端。
實現(xiàn)自定義認證后端
在《Django Auth應(yīng)用實現(xiàn)用戶身份認證》中,我們講到用戶的認證需要通過 authenticate 方法實現(xiàn),而該方法就是使用 Django 默認認證后端 ModeBackend 進行用戶驗證的,但這種驗證只是簡單地比對數(shù)據(jù)庫中存儲的用戶名和密碼是否匹配一致,這樣就會導(dǎo)致在很多情況下不能滿足實際的業(yè)務(wù)的需求。這個時候我們就可以自定義一個認證后端,來實現(xiàn)某些需求。
1) 實現(xiàn)認證后端思路分析
那么如何實現(xiàn)自定義認證后端呢?如果你沒有思路,不妨先分析一下 Django 默認的認證后端是如何實現(xiàn)的,從源碼中你也許會找到一些啟發(fā)。
首先如何想要實現(xiàn)用戶的認證必須先要獲得用戶對象,然后調(diào)用 authenticate 方法實現(xiàn)認證,所以可想而認證后端是實現(xiàn)了 get_user 和 authenticate 這兩個方法的 Python 類。其中 authenticate 將用戶身份憑據(jù)作為關(guān)鍵字參數(shù),下面我就實現(xiàn)一個簡單的認證后端。
2) 實現(xiàn)認證后端的過程
在 user 應(yīng)用下新建 backends.py 文件,將其作為單獨模塊出來,定義如下代碼:?
from django.contrib.auth.models import User class EmailBackend(object): def authenticate(self, request, **credentials): #獲取郵箱的認證信息即郵箱賬號實例 email = credentials.get('email', credentials.get('username')) try: user = User.objects.get(email=email) except Exception as error: print(error) else: #檢查用戶密碼 if user.check_password(credentials["password"]): return user def get_user(self, user_id): try: return User.objects.get(pk=user_id) except Exception as e: print(e) return None
Django 模型類都有一個主鍵字段 (ID),它用來維護模型對象的唯一性。Django 提供了一個 pk 字段來代表主鍵 ID。
我們在 authenticate 方法中,首先判斷在用戶名與密碼不為空的情況下,嘗試根據(jù) username 獲取 User 對象,然后再去比較 password 是否等同于 python_django,若相同則通過驗證,所以這個密碼可以實現(xiàn)任意用戶的驗證。最后如果要讓自定義認證后端成功認證,還需要在配置文件 settings 中進行如下配置:
#自定義認證后端 AUTHENTICATION_BACKENDS=[ 'django.contrib.auth.backends.ModelBackend', 'user.backends.EmailBackend', ]
這里需要大家注意一下:我們需要在 AUTHENTICATION_BACKENDS 變量中列出所有的認證后端,包含 Django 默認的以及自定義的,否則不能通過 username 和password 匹配的方式實現(xiàn)用戶認證,比如上述代碼中,我們自定義了一個通過郵箱和密碼實現(xiàn)用戶認證的后端,那么當(dāng)我們在不使用用戶名的情況下,還可以使用郵箱與正確的密碼進行認證。
3) 驗證認證后端是否生效
打開 Django Shell 環(huán)境 進行測試,如下所示
In [1]: from django.contrib.auth import authenticate
In [2]: user=authenticate(username="bookstore",password="python_django")
In [3]: user.backend
Out[3]: 'django.contrib.auth.backends.ModelBackend' #返回Django默認后端
In [4]: user.backend
Out[4]: 'django.contrib.auth.backends.ModelBackend'
In [5]: user=authenticate(username="bookstore",password="python")
In [6]: user is None
Out[6]: True
In [7]: user=authenticate(email="123@163.com",password="python_django")
In [8]: user.bachend
Out[8]: 'user.backends.EmailBackend' #返回自定義后端
通過上述測試,我們可以看到已經(jīng)實現(xiàn)可自定義認證后端的應(yīng)用。用戶不僅可以使用用戶名認證,還可以通過郵箱實現(xiàn)認證,從而在密碼正確的情況下,可以使用兩種方式實現(xiàn)用戶的登錄。實現(xiàn)自定義后端有很多的應(yīng)用場景,比如你還可以換成手機號來進行用戶認證等等。希望你們通過本節(jié)知識的學(xué)習(xí)會有所收獲,下節(jié)繼續(xù)!?
到此這篇關(guān)于Django通過自定義認證后端實現(xiàn)多種登錄方式驗證的文章就介紹到這了,更多相關(guān)Django 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過數(shù)據(jù)庫對Django進行刪除字段和刪除模型的操作
這篇文章主要介紹了通過數(shù)據(jù)庫對Django進行刪除字段和刪除模型的操作,這里假設(shè)我們已經(jīng)建立了一個名為book的數(shù)據(jù)模型,需要的朋友可以參考下2015-07-07解決pytorch DataLoader num_workers出現(xiàn)的問題
今天小編就為大家分享一篇解決pytorch DataLoader num_workers出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01