AUTHENTICATION_BACKENDS


[編輯]指定認證后端
在暗中,Django維護一個”authentication backends”的列表用來測試認證。當某人調用 django.contrib.auth.authenticate() — 上面提到的”如何登錄一個用戶” — Django將嘗試所有的認證后端。如果第一個認證方法失敗了,Django將會繼續嘗試第二個,直到所有的都被嘗試過。

認證后端的列表在 AUTHENTICATION_BACKENDS 設置。內容應該是包含Python路徑的元組。

默認情況下, AUTHENTICATION_BACKENDS 設置為

(‘django.contrib.auth.backends.ModelBackend’,)
這是檢測Django用戶數據庫的基本認證方案。

按照 AUTHENTICATION_BACKENDS 的排列順序,如果同樣的用戶名和密碼在第一次就匹配了,那么Django將停止處理后面的東西。

[編輯]編寫一個認證后端
一個認證后端是一個類,實現了2個方法:get_user(id) 和 authenticate(**credentials) 。

get_user 方法接受一個 id — 可以是用戶名,數據庫ID或者其他的什么 — 並且返回一個 User 對象。

authenticate 方法接受字典型認證信息的參數。大多情況下是如下樣子的

class MyBackend:
def authenticate(username=None, password=None):
# 檢測用戶名和密碼,並返回一個User。
他也可以處理一個代號(token),像這樣

class MyBackend:
def authenticate(token=None):
# 檢測並返回User。
當 authenticate 接受的參數被驗證為有效的時候,應該返回一個 User 對象;如果無效的時候,應該返回 None 。

在本文當開頭提到,Django的admin系統緊密地與 User 對象綁定在一起。目前,最好的處理方法就是為你每一個現存的后端(例如,你的LDAP目錄或者你的外部SQL數據庫等等。)數據創建一個Django的 User 對象。你可以預先寫一個腳本來做這些事情,或者在用戶第一次登錄的時候在你的 authenticate 方法中做這些事情。

下面是一個例子,使用在 settings.py 文件里定義的用戶名和密碼並且在用戶第一次登錄的時候創建一個Django的 User 對象。

from django.conf import settings
from django.contrib.auth.models import User, check_password

class SettingsBackend:
“”"
Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.

Use the login name, and a hash of the password. For example:

ADMIN_LOGIN = ‘admin’
ADMIN_PASSWORD = ‘sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de’
“”"
def authenticate(self, username=None, password=None):
login_valid = (settings.ADMIN_LOGIN == username)
pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
if login_valid and pwd_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
# 創建新用戶。
# 我們可以設置任何新的密碼,因為它不會被檢測。
# 在這里我們使用”get from settings.py”。
user = User(username=username, password=’get from settings.py’)
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None

def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM