欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django通過自定義認證后端實現(xiàn)多種登錄方式驗證

 更新時間:2021年12月03日 15:52:27   投稿:newname  
Django提供了用戶認證系統(tǒng),那么如何在項目中進行應(yīng)用呢?在本文中小編將給大家介紹如何使用用戶認證系統(tǒng),實現(xiàn)我們業(yè)務(wù)場景中常見的多種登錄方式驗證。感興趣的小伙伴可以了解一下

前言

我們見到幾乎所有的 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)文章

最新評論