Django Auth應用實現(xiàn)用戶身份認證
我們知道 Django Auth 應用一般用在用戶的登錄注冊上,用于判斷當前的用戶是否合法,從而可以幫助開發(fā)者快速的構(gòu)建用戶系統(tǒng),那么 Auth 應用又是如何是實現(xiàn)用戶的認證的呢?當給定相關(guān)的條件或?qū)傩詴r候,我們可以去獲取用戶對象這個過程就被稱為用戶認證,Django Auth 應用提供了一個用來認證的方法即 authenticate 方法用來實現(xiàn)用戶的認證行為。下面就讓我們一起來認識一下吧!
1. 實現(xiàn)用戶的認證
authenticate 方法一般接受 username 與 password 作為參數(shù),如果通過了認證,就返回認證的實例對象,否則就會返回 None,下面我們進行一下相關(guān)的實例演示:
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 用戶進行可認證,輸入它的兩個參數(shù)值,最后驗證通過返回了 user 的實例對象,最后我們更改了密碼的參數(shù)值將其設置為不正確,并使用 user is None 的方法查看其返回結(jié)果是否為 None,得到的布爾值為 Ture,所以用戶認證失敗。這就是用戶認證的的過程。
那么 authenticate 方法是如何實現(xiàn)的呢?我們分析一下它的源碼:
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: #此后端不接受這些憑據(jù)作為參數(shù)。返回繼續(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 # 所提供的憑據(jù)對所有后端、觸發(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)重寫思路。?
到此這篇關(guān)于Django Auth應用實現(xiàn)用戶身份認證的文章就介紹到這了,更多相關(guān)Django Auth應用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux中安裝Python的交互式解釋器IPython的教程
IPython是一種基于Python的Shell,由于有了Python編程語言的支撐,而比一般的Shell更加強大.下面就來看一下Linux中安裝Python的交互式解釋器IPython的教程2016-06-06關(guān)于pandas.date_range()的用法及說明
這篇文章主要介紹了關(guān)于pandas.date_range()的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07pandas中的數(shù)據(jù)去重處理的實現(xiàn)方法
這篇文章主要介紹了pandas中的數(shù)據(jù)去重處理的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02關(guān)于Python中Flask全局異常處理流程詳解
Flask是一個基于Python的Web框架,它提供了全局異常處理的機制來捕獲和處理應用程序中的異常,本文將詳細介紹Flask的全局異常處理,并提供相應的代碼示例,需要的朋友可以參考下2023-06-06基于Python_腳本CGI、特點、應用、開發(fā)環(huán)境(詳解)
下面小編就為大家?guī)硪黄赑ython_腳本CGI、特點、應用、開發(fā)環(huán)境(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05