django.contrib.auth

此文件為 Django 身份驗證系統的元件提供 API 參考資料。有關這些元件的使用方式或如何自訂身份驗證和授權的更多詳細資訊,請參閱身份驗證主題指南

User 模型

class models.User

欄位

class models.User

User 物件有下列欄位

username

必填。150 個字元或更少。使用者名稱可以包含字母數字、_@+.- 字元。

max_length 應足以應付許多使用案例。如果您需要更長的長度,請使用自訂使用者模型。如果您使用 MySQL 和 utf8mb4 編碼(建議使用以獲得正確的 Unicode 支援),請指定最多 max_length=191,因為在該情況下,MySQL 預設只能建立具有 191 個字元的唯一索引。

first_name

選填 (blank=True)。150 個字元或更少。

last_name

選填 (blank=True)。150 個字元或更少。

email

選填 (blank=True)。電子郵件地址。

password

必填。密碼的雜湊值和中繼資料。(Django 不會儲存原始密碼。)原始密碼可以是任意長度,並且可以包含任何字元。此欄位中的中繼資料可能會將密碼標記為無法使用。請參閱密碼文件

groups

Group 的多對多關係

user_permissions

Permission 的多對多關係

is_staff

布林值。允許此使用者存取管理網站。

is_active

布林值。將此使用者帳戶標記為啟用。我們建議您將此旗標設定為 False 而不是刪除帳戶。這樣,如果您的應用程式有任何使用者外鍵,外鍵將不會中斷。

這不一定會控制使用者是否可以登入。身分驗證後端不需要檢查 is_active 旗標,但預設後端(ModelBackend)和 RemoteUserBackend 會檢查。如果您想允許停用的使用者登入,可以使用 AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend。在這種情況下,您還需要自訂 AuthenticationForm (由 LoginView 使用),因為它會拒絕停用的使用者。請注意,權限檢查方法(例如 has_perm())和 Django 管理員中的身分驗證都會針對停用的使用者傳回 False

is_superuser

布林值。將此使用者視為擁有所有權限,而無需特別指派任何權限給他。

last_login

使用者上次登入的日期時間。

date_joined

建立帳戶的日期/時間。

屬性

class models.User
is_authenticated

唯讀屬性,永遠為 True(與永遠為 FalseAnonymousUser.is_authenticated 相反)。這是一種判斷使用者是否已通過身份驗證的方法。這並不意味著任何權限,也不會檢查使用者是否已啟用或擁有有效的會話。即使您通常會在 request.user 上檢查此屬性,以找出它是否已由 AuthenticationMiddleware 填入(表示目前已登入的使用者),您應該知道任何 User 執行個體的此屬性都為 True

is_anonymous

唯讀屬性,永遠為 False。這是一種區分 UserAnonymousUser 物件的方法。一般來說,您應該優先使用 is_authenticated 而不是此屬性。

方法

class models.User
get_username()

傳回使用者的使用者名稱。由於 User 模型可以被換掉,您應該使用此方法,而不是直接參考使用者名稱屬性。

get_full_name()

傳回 first_name 加上 last_name,中間以空格隔開。

get_short_name()

回傳 first_name

set_password(raw_password)

將使用者的密碼設定為給定的原始字串,並處理密碼雜湊。不會儲存 User 物件。

raw_passwordNone 時,密碼將被設定為無法使用的密碼,如同使用了 set_unusable_password() 一樣。

check_password(raw_password)
acheck_password(raw_password)

非同步版本acheck_password()

如果給定的原始字串是使用者的正確密碼,則回傳 True。(此方法會在進行比較時處理密碼雜湊)。

在 Django 5.0 中變更

新增了 acheck_password() 方法。

set_unusable_password()

透過更新 password 欄位中的中繼資料,將使用者標記為未設定密碼。這與將密碼設為空白字串不同。對於此使用者,check_password() 永遠不會回傳 True。不會儲存 User 物件。

如果您的應用程式的身份驗證是針對現有的外部來源 (例如 LDAP 目錄) 進行,您可能需要此方法。

密碼重設限制

具有無法使用密碼的使用者將無法透過 PasswordResetView 要求密碼重設電子郵件。

has_usable_password()

如果已針對此使用者呼叫 set_unusable_password(),則回傳 False

get_user_permissions(obj=None)

回傳使用者直接擁有的權限字串集合。

如果傳入 obj,則僅回傳此特定物件的使用者權限。

get_group_permissions(obj=None)

回傳使用者透過其群組擁有的權限字串集合。

如果傳入 obj,則僅回傳此特定物件的群組權限。

get_all_permissions(obj=None)

回傳使用者透過群組和使用者權限擁有的權限字串集合。

如果傳入 obj,則僅回傳此特定物件的權限。

has_perm(perm, obj=None)

如果使用者擁有指定的權限,則回傳 True,其中 perm 的格式為 "<應用程式標籤>.<權限代碼名稱>"。(請參閱關於 權限 的文件)。如果使用者為非作用中,此方法將永遠回傳 False。對於作用中的超級使用者,此方法將永遠回傳 True

如果傳入 obj,此方法將不會檢查模型的權限,而是檢查此特定物件的權限。

has_perms(perm_list, obj=None)

如果使用者擁有每個指定的權限,則回傳 True,其中每個 perm 的格式為 "<應用程式標籤>.<權限代碼名稱>"。如果使用者為非作用中,此方法將永遠回傳 False。對於作用中的超級使用者,此方法將永遠回傳 True

如果傳入 obj,此方法將不會檢查模型的權限,而是檢查特定物件的權限。

has_module_perms(package_name)

如果使用者在給定的套件 (Django 應用程式標籤) 中擁有任何權限,則回傳 True。如果使用者為非作用中,此方法將永遠回傳 False。對於作用中的超級使用者,此方法將永遠回傳 True

email_user(subject, message, from_email=None, **kwargs)

向使用者傳送電子郵件。如果 from_emailNone,Django 會使用 DEFAULT_FROM_EMAIL。任何 **kwargs 都會傳遞給底層的 send_mail() 呼叫。

管理器方法

class models.UserManager

User 模型有一個自訂管理器,除了 BaseUserManager 提供的方法外,還具有以下輔助方法。

create_user(username, email=None, password=None, **extra_fields)

建立、儲存並回傳 User

會依照給定的值設定 usernamepasswordemail 的網域部分會自動轉換為小寫,而且回傳的 User 物件會將 is_active 設定為 True

如果未提供密碼,將會呼叫 set_unusable_password()

extra_fields 關鍵字引數會傳遞至 User__init__ 方法,以允許在 自訂使用者模型 上設定任意欄位。

請參閱 建立使用者 以取得範例用法。

create_superuser(username, email=None, password=None, **extra_fields)

create_user() 相同,但會將 is_staffis_superuser 設定為 True

with_perm(perm, is_active=True, include_superusers=True, backend=None, obj=None)

返回具有給定權限 perm 的使用者,權限格式可以是 "<應用程式標籤>.<權限代碼名稱>",也可以是 Permission 實例。如果找不到具有 perm 的使用者,則返回空的查詢集。

如果 is_activeTrue (預設值),則僅返回活動使用者;如果為 False,則僅返回非活動使用者。使用 None 返回所有使用者,無論其活動狀態如何。

如果 include_superusersTrue (預設值),則結果將包含超級使用者。

如果傳入 backend,並且該值已在 AUTHENTICATION_BACKENDS 中定義,則此方法將使用它。否則,如果 AUTHENTICATION_BACKENDS 中只有一個 backend,則會使用該值;否則會引發例外。

AnonymousUser 物件

class models.AnonymousUser

django.contrib.auth.models.AnonymousUser 是一個類別,它實作了 django.contrib.auth.models.User 介面,但具有以下差異:

實際上,您可能不需要自己使用 AnonymousUser 物件,但它們會被 Web 請求使用,如下一節所述。

Permission 模型

class models.Permission

欄位

Permission 物件具有下列欄位:

class models.Permission
name

必填。最多 255 個字元。範例:'Can vote'

content_type

必填。參考 django_content_type 資料庫表格,該表格包含每個已安裝模型的記錄。

codename

必填。最多 100 個字元。範例:'can_vote'

方法

Permission 物件具有與任何其他 Django 模型 相同的標準資料存取方法。

Group 模型

class models.Group

欄位

Group 物件具有下列欄位:

class models.Group
name

必填。最多 150 個字元。允許任何字元。範例:'Awesome Users'

permissions

Permission 的多對多欄位

group.permissions.set([permission_list])
group.permissions.add(permission, permission, ...)
group.permissions.remove(permission, permission, ...)
group.permissions.clear()

驗證器

class validators.ASCIIUsernameValidator

一個欄位驗證器,只允許 ASCII 字母和數字,以及 @.+-_

class validators.UnicodeUsernameValidator

一個欄位驗證器,允許 Unicode 字元,以及 @.+-_User.username 的預設驗證器。

登入和登出訊號

身份驗證框架使用下列訊號,可在使用者登入或登出時用於通知。

user_logged_in

當使用者成功登入時發送。

此訊號傳送的參數

sender

剛登入的使用者類別。

request

目前的 HttpRequest 實例。

user

剛登入的使用者實例。

user_logged_out

當呼叫登出方法時發送。

sender

如上所述:剛登出的使用者類別,如果使用者未通過驗證則為 None

request

目前的 HttpRequest 實例。

user

剛登出的使用者實例,如果使用者未通過驗證則為 None

user_login_failed

當使用者未能成功登入時發送

sender

用於驗證的模組名稱。

credentials

包含傳遞給 authenticate() 或您自己的自訂驗證後端的的使用者憑證的關鍵字引數字典。符合一組「敏感」模式(包括密碼)的憑證,不會以明文形式作為訊號的一部分發送。

request

如果提供了 HttpRequest 物件給 authenticate(),則為該物件。

身份驗證後端

本節詳細介紹 Django 隨附的身份驗證後端。有關如何使用它們以及如何編寫自己的身份驗證後端的資訊,請參閱使用者身份驗證指南的「其他身份驗證來源」一節中的內容。

可用的身份驗證後端

下列後端可在 django.contrib.auth.backends 中使用

class BaseBackend[原始碼]

一個基礎類別,為所有必要的方法提供預設實作。預設情況下,它會拒絕任何使用者,且不提供任何權限。

get_user_permissions(user_obj, obj=None)[原始碼]

傳回一個空的集合。

get_group_permissions(user_obj, obj=None)[原始碼]

傳回一個空的集合。

get_all_permissions(user_obj, obj=None)[原始碼]

使用 get_user_permissions()get_group_permissions() 來取得 user_obj 所擁有的權限字串集合。

has_perm(user_obj, perm, obj=None)[原始碼]

使用 get_all_permissions() 來檢查 user_obj 是否擁有權限字串 perm

class ModelBackend[原始碼]

這是 Django 使用的預設身份驗證後端。它使用使用者識別碼和密碼組成的憑證進行驗證。對於 Django 的預設使用者模型,使用者識別碼是使用者名稱,對於自訂使用者模型,則是由 USERNAME_FIELD 指定的欄位(請參閱自訂使用者和身份驗證)。

它也處理為 UserPermissionsMixin 定義的預設權限模型。

has_perm()get_all_permissions()get_user_permissions()get_group_permissions() 允許將物件作為物件特定權限的參數傳遞,但此後端除了在 obj is not None 時傳回空的權限集合外,不實作它們。

with_perm() 也允許將物件作為參數傳遞,但與其他方法不同,如果 obj is not None,它會傳回一個空的查詢集。

authenticate(request, username=None, password=None, **kwargs)[原始碼]

嘗試透過呼叫 User.check_password,使用 password 驗證 username。如果未提供 username,則會嘗試使用 CustomUser.USERNAME_FIELD 作為鍵值,從 kwargs 中獲取使用者名稱。返回已驗證的使用者,或 None

request 是一個 HttpRequest,如果它沒有提供給 authenticate() (該函式會將其傳遞給後端) 的話,則可能為 None

get_user_permissions(user_obj, obj=None)[原始碼]

傳回 user_obj 從其自身使用者權限中取得的權限字串集合。如果 is_anonymousis_activeFalse,則傳回空集合。

get_group_permissions(user_obj, obj=None)[原始碼]

傳回 user_obj 從其所屬群組的權限中取得的權限字串集合。如果 is_anonymousis_activeFalse,則傳回空集合。

get_all_permissions(user_obj, obj=None)[原始碼]

傳回 user_obj 擁有的權限字串集合,包括使用者權限和群組權限。如果 is_anonymousis_activeFalse,則傳回空集合。

has_perm(user_obj, perm, obj=None)[原始碼]

使用 get_all_permissions() 來檢查 user_obj 是否具有權限字串 perm。如果使用者未 is_active,則傳回 False

has_module_perms(user_obj, app_label)[原始碼]

傳回 user_obj 是否在應用程式 app_label 上擁有任何權限。

user_can_authenticate()[原始碼]

傳回是否允許使用者進行驗證。為了與 AuthenticationForm 的行為匹配,該表單 禁止 非活動使用者 登入,此方法對於 is_active=False 的使用者傳回 False。允許不具有 is_active 欄位的自訂使用者模型。

with_perm(perm, is_active=True, include_superusers=True, obj=None)[原始碼]

傳回所有具有權限 perm 的活動使用者,權限形式可以是 "<應用程式 標籤>.<權限 代碼名稱>"Permission 實例。如果沒有找到具有 perm 的使用者,則傳回空的查詢集。

如果 is_activeTrue (預設值),則僅返回活動使用者;如果為 False,則僅返回非活動使用者。使用 None 返回所有使用者,無論其活動狀態如何。

如果 include_superusersTrue (預設值),則結果將包含超級使用者。

class AllowAllUsersModelBackend[原始碼]

ModelBackend 相同,只是它不拒絕非活動使用者,因為 user_can_authenticate() 永遠傳回 True

當使用此後端時,您可能需要自訂 AuthenticationForm,該表單由 LoginView 使用,方法是覆寫 confirm_login_allowed() 方法,因為該方法會拒絕非活動使用者。

class RemoteUserBackend[原始碼]

使用此後端來利用 Django 外部處理的身份驗證。它使用傳遞到 request.META['REMOTE_USER'] 中的使用者名稱進行身份驗證。請參閱對 REMOTE_USER 進行身份驗證 文件。

如果您需要更多控制權,您可以建立自己的身份驗證後端,繼承自此類別並覆寫這些屬性或方法

create_unknown_user

TrueFalse。決定是否在資料庫中還不存在時建立使用者物件。預設為 True

authenticate(request, remote_user)[原始碼]

作為 remote_user 傳遞的使用者名稱被視為可信任。如果 create_unknown_userTrue,則此方法會傳回具有給定使用者名稱的使用者物件,並建立新的使用者物件。

如果 create_unknown_userFalse 且在資料庫中找不到具有給定使用者名稱的 User 物件,則傳回 None

request 是一個 HttpRequest,如果它沒有提供給 authenticate() (該函式會將其傳遞給後端) 的話,則可能為 None

clean_username(username)[原始碼]

在取得或建立使用者物件之前,對 username 執行任何清理操作(例如,剝除 LDAP DN 資訊)。傳回清理後的使用者名稱。

configure_user(request, user, created=True)[原始碼]

在每次身份驗證嘗試時設定使用者。此方法在提取或建立要驗證的使用者後立即呼叫,可用於執行自訂設定動作,例如根據 LDAP 目錄中的屬性設定使用者的群組。傳回使用者物件。

設定可以在使用者建立時執行一次(createdTrue),或者在現有使用者上執行(createdFalse),作為同步遠端系統和本地系統之間屬性的方式。

request 是一個 HttpRequest,如果它沒有提供給 authenticate() (該函式會將其傳遞給後端) 的話,則可能為 None

user_can_authenticate()

傳回是否允許使用者進行身份驗證。此方法對於具有 is_active=False 的使用者傳回 False。允許不具有 is_active 欄位的自訂使用者模型。

class AllowAllUsersRemoteUserBackend[原始碼]

RemoteUserBackend 相同,只是它不拒絕非活動使用者,因為 user_can_authenticate 總是傳回 True

實用函式

get_user(request)[原始碼]
aget_user(request)

非同步版本aget_user()

傳回與給定 request 的會話相關聯的使用者模型實例。

它會檢查會話中儲存的身份驗證後端是否存在於 AUTHENTICATION_BACKENDS 中。如果是,它會使用後端的 get_user() 方法來檢索使用者模型實例,然後透過呼叫使用者模型的 get_session_auth_hash() 方法來驗證會話。如果驗證失敗且提供了 SECRET_KEY_FALLBACKS,它會使用 get_session_auth_fallback_hash() 針對每個後備金鑰驗證會話。

如果會話中儲存的身份驗證後端不再位於 AUTHENTICATION_BACKENDS 中,如果後端的 get_user() 方法未傳回使用者,或者如果會話身份驗證雜湊未通過驗證,則傳回 AnonymousUser 的實例。

在 Django 5.0 中變更

新增了 aget_user() 函式。

返回頂部