Django Auth應用實現用戶身份認證
我們知道 Django Auth 應用一般用在用戶的登錄注冊上,用于判斷當前的用戶是否合法,從而可以幫助開發(fā)者快速的構建用戶系統(tǒng),那么 Auth 應用又是如何是實現用戶的認證的呢?當給定相關的條件或屬性時候,我們可以去獲取用戶對象這個過程就被稱為用戶認證,Django Auth 應用提供了一個用來認證的方法即 authenticate 方法用來實現用戶的認證行為。下面就讓我們一起來認識一下吧!
1. 實現用戶的認證
authenticate 方法一般接受 username 與 password 作為參數,如果通過了認證,就返回認證的實例對象,否則就會返回 None,下面我們進行一下相關的實例演示:
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
用戶認證過程解析
上述代碼中,我們首先引入 authenticate ,可知該方法定義在 django/contrib/auth/__init__.py 文件中,然后我們對上一節(jié)中創(chuàng)建的 user 用戶進行可認證,輸入它的兩個參數值,最后驗證通過返回了 user 的實例對象,最后我們更改了密碼的參數值將其設置為不正確,并使用 user is None 的方法查看其返回結果是否為 None,得到的布爾值為 Ture,所以用戶認證失敗。這就是用戶認證的的過程。
那么 authenticate 方法是如何實現的呢?我們分析一下它的源碼:
def authenticate(request=None, **credentials):
#__get_backends獲取當前系統(tǒng)中定義的認證后端,并依次迭代
for backend, backend_path in _get_backends(return_tuples=True):
try:
inspect.getcallargs(backend.authenticate, request, **credentials)
except TypeError:
#此后端不接受這些憑據作為參數。返回繼續(xù)執(zhí)行循環(huán)
continue
try:
#通過當前的認證后端嘗試獲取 User,若獲取不到就會拋出異常!
user = backend.authenticate(request, **credentials)
except PermissionDenied:
#拋出異常Permission
break
#如果沒有返回,繼續(xù)執(zhí)行下一個認證
if user is None:
continue
#添加一個屬性標志,代表后端認證成功
user.backend = backend_path
return user
# 所提供的憑據對所有后端、觸發(fā)信號無效
user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)
Django獲取后端認證
上述代碼中,我們可以看出,authenticate 方法使用了當前系統(tǒng)中定義的認證后端來獲取用戶對象,當前系統(tǒng)的默認認證后端是 ModelBackend。那么 Django 是如何獲取認證后端的呢?如下所示:
def _get_backends(return_tuples=False):
backends = []
#AUTHENTICATION_BACKENDS 定義了當前系統(tǒng)可以用的身份認證列表
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
但是我們并沒有對 AUTHENTICATION_BACKENDS 進行定義,所以這里會使用戶 Django 框架默認的后端認認證,它位于 django/conf/global_settings.py 文件中,如下所示:
AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend'] #當前系統(tǒng)默認認證后端ModelBackend
AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend']? #當前系統(tǒng)默認認證后端ModelBackend
2. Auth應用獲取用戶模型
get_user_model 用于獲取當前系統(tǒng)定義的“用戶模型”。其源代碼如下所示:
def get_user_model():
"""
返回一個處于激活狀態(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 使用實例如下所示:
# 使用默認User model時 >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'django.contrib.auth.models.User'> # 使用自定義User model時 >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'xxx.models.NewUser'> # get_user_model()實際獲取的是settings.AUTH_USER_MODEL指定的User model
Django 允許在 settings.py 文件中定義 AUTH_USER_MODEL 覆蓋默認的 auth.User,以滿足特定項目的需求。所以,ModelBacakend 的 authenticate 方法首先會通過 username 嘗試獲取 User 對象,再去校驗密碼是否正確以及 is_active 的狀態(tài),最后返回 User 對象或是返回 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 文件中定義了用戶的各種行為,例如,登錄、退出、用戶的認證等等,通過這些可見 Django 的強大所在,Auth 應用模塊可以幫助開發(fā)者減少很多的工作量,而且 Auth 應用的源碼可以給開發(fā)者提供諸多的用戶系統(tǒng)重寫思路。?
到此這篇關于Django Auth應用實現用戶身份認證的文章就介紹到這了,更多相關Django Auth應用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用matplotlib創(chuàng)建Gif動圖的實現
本文主要介紹了使用matplotlib創(chuàng)建Gif動圖的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
Python中使用subprocess庫創(chuàng)建附加進程
這篇文章主要介紹了subprocess庫:Python中創(chuàng)建附加進程的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05

