Django Auth應(yīng)用實(shí)現(xiàn)用戶身份認(rèn)證
我們知道 Django Auth 應(yīng)用一般用在用戶的登錄注冊(cè)上,用于判斷當(dāng)前的用戶是否合法,從而可以幫助開發(fā)者快速的構(gòu)建用戶系統(tǒng),那么 Auth 應(yīng)用又是如何是實(shí)現(xiàn)用戶的認(rèn)證的呢?當(dāng)給定相關(guān)的條件或?qū)傩詴r(shí)候,我們可以去獲取用戶對(duì)象這個(gè)過程就被稱為用戶認(rèn)證,Django Auth 應(yīng)用提供了一個(gè)用來(lái)認(rèn)證的方法即 authenticate 方法用來(lái)實(shí)現(xiàn)用戶的認(rèn)證行為。下面就讓我們一起來(lái)認(rèn)識(shí)一下吧!
1. 實(shí)現(xiàn)用戶的認(rèn)證
authenticate 方法一般接受 username 與 password 作為參數(shù),如果通過了認(rèn)證,就返回認(rèn)證的實(shí)例對(duì)象,否則就會(huì)返回 None,下面我們進(jìn)行一下相關(guān)的實(shí)例演示:
In [1]: from django.contrib.auth import authenticate
In [2]: user=authenticate(username="bookstore",password="python_django")
In [3]: user
Out[3]: <User: bookstore>
In [4]: user=authenticate(username="bookstore",password="python")
In [5]: user is None
Out[5]: True
用戶認(rèn)證過程解析
上述代碼中,我們首先引入 authenticate ,可知該方法定義在 django/contrib/auth/__init__.py 文件中,然后我們對(duì)上一節(jié)中創(chuàng)建的 user 用戶進(jìn)行可認(rèn)證,輸入它的兩個(gè)參數(shù)值,最后驗(yàn)證通過返回了 user 的實(shí)例對(duì)象,最后我們更改了密碼的參數(shù)值將其設(shè)置為不正確,并使用 user is None 的方法查看其返回結(jié)果是否為 None,得到的布爾值為 Ture,所以用戶認(rèn)證失敗。這就是用戶認(rèn)證的的過程。
那么 authenticate 方法是如何實(shí)現(xiàn)的呢?我們分析一下它的源碼:
def authenticate(request=None, **credentials):
#__get_backends獲取當(dāng)前系統(tǒng)中定義的認(rèn)證后端,并依次迭代
for backend, backend_path in _get_backends(return_tuples=True):
try:
inspect.getcallargs(backend.authenticate, request, **credentials)
except TypeError:
#此后端不接受這些憑據(jù)作為參數(shù)。返回繼續(xù)執(zhí)行循環(huán)
continue
try:
#通過當(dāng)前的認(rèn)證后端嘗試獲取 User,若獲取不到就會(huì)拋出異常!
user = backend.authenticate(request, **credentials)
except PermissionDenied:
#拋出異常Permission
break
#如果沒有返回,繼續(xù)執(zhí)行下一個(gè)認(rèn)證
if user is None:
continue
#添加一個(gè)屬性標(biāo)志,代表后端認(rèn)證成功
user.backend = backend_path
return user
# 所提供的憑據(jù)對(duì)所有后端、觸發(fā)信號(hào)無(wú)效
user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)
Django獲取后端認(rèn)證
上述代碼中,我們可以看出,authenticate 方法使用了當(dāng)前系統(tǒng)中定義的認(rèn)證后端來(lái)獲取用戶對(duì)象,當(dāng)前系統(tǒng)的默認(rèn)認(rèn)證后端是 ModelBackend。那么 Django 是如何獲取認(rèn)證后端的呢?如下所示:
def _get_backends(return_tuples=False):
backends = []
#AUTHENTICATION_BACKENDS 定義了當(dāng)前系統(tǒng)可以用的身份認(rèn)證列表
for backend_path in settings.AUTHENTICATION_BACKENDS:
#加載后端
backend = load_backend(backend_path)
backends.append((backend, backend_path) if return_tuples else backend)
#如果未定義后端列表拋出異常
if not backends:
raise ImproperlyConfigured(
'No authentication backends have been defined. Does '
'AUTHENTICATION_BACKENDS contain anything?'
)
return backends
但是我們并沒有對(duì) AUTHENTICATION_BACKENDS 進(jìn)行定義,所以這里會(huì)使用戶 Django 框架默認(rèn)的后端認(rèn)認(rèn)證,它位于 django/conf/global_settings.py 文件中,如下所示:
AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend'] #當(dāng)前系統(tǒng)默認(rèn)認(rèn)證后端ModelBackend
AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']? #當(dāng)前系統(tǒng)默認(rèn)認(rèn)證后端ModelBackend
2. Auth應(yīng)用獲取用戶模型
get_user_model 用于獲取當(dāng)前系統(tǒng)定義的“用戶模型”。其源代碼如下所示:
def get_user_model():
"""
返回一個(gè)處于激活狀態(tài)的 User
"""
try:
return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
except ValueError:
raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
except LookupError:
raise ImproperlyConfigured(
"AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
)
get_user_model 使用實(shí)例如下所示:
# 使用默認(rèn)User model時(shí) >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'django.contrib.auth.models.User'> # 使用自定義User model時(shí) >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'xxx.models.NewUser'> # get_user_model()實(shí)際獲取的是settings.AUTH_USER_MODEL指定的User model
Django 允許在 settings.py 文件中定義 AUTH_USER_MODEL 覆蓋默認(rèn)的 auth.User,以滿足特定項(xiàng)目的需求。所以,ModelBacakend 的 authenticate 方法首先會(huì)通過 username 嘗試獲取 User 對(duì)象,再去校驗(yàn)密碼是否正確以及 is_active 的狀態(tài),最后返回 User 對(duì)象或是返回 None。在? settings.py 配置 AUTH_USER_MODEL 格式如下所示:
#格式: "<django_app名>.<model名>"
AUTH_USER_MODEL = "appname.NewUser"
#在models.py編寫示例
from django.conf import settings
from django.db import models
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=100)
在 django/contrib/auth/__init__.py 文件中定義了用戶的各種行為,例如,登錄、退出、用戶的認(rèn)證等等,通過這些可見 Django 的強(qiáng)大所在,Auth 應(yīng)用模塊可以幫助開發(fā)者減少很多的工作量,而且 Auth 應(yīng)用的源碼可以給開發(fā)者提供諸多的用戶系統(tǒng)重寫思路。?
到此這篇關(guān)于Django Auth應(yīng)用實(shí)現(xiàn)用戶身份認(rèn)證的文章就介紹到這了,更多相關(guān)Django Auth應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python樹莓派通過隊(duì)列實(shí)現(xiàn)進(jìn)程交互的程序分析
這篇博客就結(jié)合實(shí)際的python程序通過隊(duì)列實(shí)現(xiàn)進(jìn)程交互,通過程序分析需要的庫(kù)函數(shù),對(duì)python樹莓派進(jìn)程交互相關(guān)知識(shí)感興趣的朋友一起看看吧2021-07-07
使用Python實(shí)現(xiàn)首頁(yè)通知功能
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)首頁(yè)通知功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn)
本文主要介紹了使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Python中使用subprocess庫(kù)創(chuàng)建附加進(jìn)程
這篇文章主要介紹了subprocess庫(kù):Python中創(chuàng)建附加進(jìn)程的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05

