自定義身份認證:
Django 自帶的認證系統足夠應付大多數情況,但你或許不打算使用現成的認證系統。定制自己的項目的權限系統需要了解哪些一些關鍵點,即Django中哪些部分是能夠擴展或替換的。這個文檔提供了如何定制權限系統的細節。
“認證”后端 在以下情形時可被擴展:當一個 User 模型對象帶有用戶名和密碼時,且需要有別於 Django 默認的認證功能。
你可為你的模型提供可通過 Django 權限系統檢查的 定制的權限。
你能夠擴展 默認的 User 模型,或實現 一個完全定制的模型。
指定認證后端:
在底層,Django 維護一個“認證后台”的列表。當調用django.contrib.auth.authenticate() 時 —— 如何登入一個用戶 中所描述的 —— Django 會嘗試所有的認證后台進行認證。如果第一個認證方法失敗,Django 將嘗試第二個,以此類推,直至試完所有的認證后台。
使用的認證后台通過AUTHENTICATION_BACKENDS 設置指定。它應該是一個包含Python 路徑名稱的元組,它們指向的Python 類知道如何進行驗證。這些類可以位於Python 路徑上任何地方。
默認情況下,AUTHENTICATION_BACKENDS 設置為:
('django.contrib.auth.backends.ModelBackend',)
這個基本的認證后台會檢查Django 的用戶數據庫並查詢內建的權限。它不會通過任何的速率限制機制防護暴力破解。你可以在自定義的認證后端中實現自己的速率控制機制,或者使用大部分Web 服務器提供的機制。
AUTHENTICATION_BACKENDS 的順序很重要,所以如果用戶名和密碼在多個后台中都是合法的,Django 將在第一個匹配成功后停止處理。
如果后台引發PermissionDenied 異常,認證將立即失敗。Django 不會檢查后面的認證后台。
編寫認證后端:
繼承django.contrib.auth.backends.ModelBackend后實現authenticate方法即可。
實例:
class CustomBackend(ModelBackend):
"""
自定義用戶驗證
"""
def authenticate(self, username=None, password=None, **kwargs):
try:
user = User.objects.get(Q(username=username)|Q(mobile=username))
if user.check_password(password):
return user
except Exception as e:
return None
settings.py
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)
