Django 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