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
)。電子郵件地址。
- user_permissions¶
與
Permission
的多對多關係
- is_staff¶
布林值。允許此使用者存取管理網站。
- is_active¶
布林值。將此使用者帳戶標記為啟用。我們建議您將此旗標設定為
False
而不是刪除帳戶。這樣,如果您的應用程式有任何使用者外鍵,外鍵將不會中斷。這不一定會控制使用者是否可以登入。身分驗證後端不需要檢查
is_active
旗標,但預設後端(ModelBackend
)和RemoteUserBackend
會檢查。如果您想允許停用的使用者登入,可以使用AllowAllUsersModelBackend
或AllowAllUsersRemoteUserBackend
。在這種情況下,您還需要自訂AuthenticationForm
(由LoginView
使用),因為它會拒絕停用的使用者。請注意,權限檢查方法(例如has_perm()
)和 Django 管理員中的身分驗證都會針對停用的使用者傳回False
。
- is_superuser¶
布林值。將此使用者視為擁有所有權限,而無需特別指派任何權限給他。
- last_login¶
使用者上次登入的日期時間。
- date_joined¶
建立帳戶的日期/時間。
屬性¶
- class models.User
- is_authenticated¶
唯讀屬性,永遠為
True
(與永遠為False
的AnonymousUser.is_authenticated
相反)。這是一種判斷使用者是否已通過身份驗證的方法。這並不意味著任何權限,也不會檢查使用者是否已啟用或擁有有效的會話。即使您通常會在request.user
上檢查此屬性,以找出它是否已由AuthenticationMiddleware
填入(表示目前已登入的使用者),您應該知道任何User
執行個體的此屬性都為True
。
- is_anonymous¶
唯讀屬性,永遠為
False
。這是一種區分User
和AnonymousUser
物件的方法。一般來說,您應該優先使用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_password
為None
時,密碼將被設定為無法使用的密碼,如同使用了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_email
為None
,Django 會使用DEFAULT_FROM_EMAIL
。任何**kwargs
都會傳遞給底層的send_mail()
呼叫。
管理器方法 ¶
- class models.UserManager ¶
User
模型有一個自訂管理器,除了BaseUserManager
提供的方法外,還具有以下輔助方法。- create_user(username, email=None, password=None, **extra_fields) ¶
建立、儲存並回傳
User
。會依照給定的值設定
username
和password
。email
的網域部分會自動轉換為小寫,而且回傳的User
物件會將is_active
設定為True
。如果未提供密碼,將會呼叫
set_unusable_password()
。extra_fields
關鍵字引數會傳遞至User
的__init__
方法,以允許在 自訂使用者模型 上設定任意欄位。請參閱 建立使用者 以取得範例用法。
- create_superuser(username, email=None, password=None, **extra_fields) ¶
與
create_user()
相同,但會將is_staff
和is_superuser
設定為True
。
- with_perm(perm, is_active=True, include_superusers=True, backend=None, obj=None)¶
返回具有給定權限
perm
的使用者,權限格式可以是"<應用程式標籤>.<權限代碼名稱>"
,也可以是Permission
實例。如果找不到具有perm
的使用者,則返回空的查詢集。如果
is_active
為True
(預設值),則僅返回活動使用者;如果為False
,則僅返回非活動使用者。使用None
返回所有使用者,無論其活動狀態如何。如果
include_superusers
為True
(預設值),則結果將包含超級使用者。如果傳入
backend
,並且該值已在AUTHENTICATION_BACKENDS
中定義,則此方法將使用它。否則,如果AUTHENTICATION_BACKENDS
中只有一個backend
,則會使用該值;否則會引發例外。
AnonymousUser
物件¶
- class models.AnonymousUser¶
django.contrib.auth.models.AnonymousUser
是一個類別,它實作了django.contrib.auth.models.User
介面,但具有以下差異:id 永遠為
None
。username
永遠是空字串。get_username()
永遠返回空字串。is_anonymous
為True
,而不是False
。is_authenticated
為False
,而不是True
。is_staff
和is_superuser
永遠為False
。is_active
永遠為False
。groups
和user_permissions
永遠是空的。set_password()
、check_password()
、save()
和delete()
會引發NotImplementedError
。
實際上,您可能不需要自己使用 AnonymousUser
物件,但它們會被 Web 請求使用,如下一節所述。
Permission
模型¶
- class models.Permission¶
欄位¶
Permission
物件具有下列欄位:
方法¶
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_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 指定的欄位(請參閱自訂使用者和身份驗證)。
它也處理為
User
和PermissionsMixin
定義的預設權限模型。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_anonymous
或is_active
為False
,則傳回空集合。
- get_group_permissions(user_obj, obj=None)[原始碼]¶
傳回
user_obj
從其所屬群組的權限中取得的權限字串集合。如果is_anonymous
或is_active
為False
,則傳回空集合。
- get_all_permissions(user_obj, obj=None)[原始碼]¶
傳回
user_obj
擁有的權限字串集合,包括使用者權限和群組權限。如果is_anonymous
或is_active
為False
,則傳回空集合。
- has_perm(user_obj, perm, obj=None)[原始碼]¶
使用
get_all_permissions()
來檢查user_obj
是否具有權限字串perm
。如果使用者未is_active
,則傳回False
。
- 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_active
為True
(預設值),則僅返回活動使用者;如果為False
,則僅返回非活動使用者。使用None
返回所有使用者,無論其活動狀態如何。如果
include_superusers
為True
(預設值),則結果將包含超級使用者。
- class AllowAllUsersModelBackend[原始碼]¶
與
ModelBackend
相同,只是它不拒絕非活動使用者,因為user_can_authenticate()
永遠傳回True
。當使用此後端時,您可能需要自訂
AuthenticationForm
,該表單由LoginView
使用,方法是覆寫confirm_login_allowed()
方法,因為該方法會拒絕非活動使用者。
- class RemoteUserBackend[原始碼]¶
使用此後端來利用 Django 外部處理的身份驗證。它使用傳遞到
request.META['REMOTE_USER']
中的使用者名稱進行身份驗證。請參閱對 REMOTE_USER 進行身份驗證 文件。如果您需要更多控制權,您可以建立自己的身份驗證後端,繼承自此類別並覆寫這些屬性或方法
- create_unknown_user¶
True
或False
。決定是否在資料庫中還不存在時建立使用者物件。預設為True
。
- authenticate(request, remote_user)[原始碼]¶
作為
remote_user
傳遞的使用者名稱被視為可信任。如果create_unknown_user
為True
,則此方法會傳回具有給定使用者名稱的使用者物件,並建立新的使用者物件。如果
create_unknown_user
為False
且在資料庫中找不到具有給定使用者名稱的User
物件,則傳回None
。request
是一個HttpRequest
,如果它沒有提供給authenticate()
(該函式會將其傳遞給後端) 的話,則可能為None
。
- configure_user(request, user, created=True)[原始碼]¶
在每次身份驗證嘗試時設定使用者。此方法在提取或建立要驗證的使用者後立即呼叫,可用於執行自訂設定動作,例如根據 LDAP 目錄中的屬性設定使用者的群組。傳回使用者物件。
設定可以在使用者建立時執行一次(
created
為True
),或者在現有使用者上執行(created
為False
),作為同步遠端系統和本地系統之間屬性的方式。request
是一個HttpRequest
,如果它沒有提供給authenticate()
(該函式會將其傳遞給後端) 的話,則可能為None
。
- user_can_authenticate()¶
傳回是否允許使用者進行身份驗證。此方法對於具有
is_active=False
的使用者傳回False
。允許不具有is_active
欄位的自訂使用者模型。
- class AllowAllUsersRemoteUserBackend[原始碼]¶
與
RemoteUserBackend
相同,只是它不拒絕非活動使用者,因為user_can_authenticate
總是傳回True
。
實用函式¶
- 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()
函式。