django.contrib.auth
¶
本文档提供 Django 身份验证系统组件的 API 参考材料。有关这些组件用法的更多详细信息或如何自定义身份验证和授权,请参阅身份验证主题指南。
User
模型¶
- class models.User¶
字段¶
- class models.User
User
对象具有以下字段- username¶
必填。最多 150 个字符。用户名可以包含字母数字、
_
、@
、+
、.
和-
字符。max_length
对于许多用例来说应该足够了。如果您需要更长的长度,请使用自定义用户模型。如果您使用带有utf8mb4
编码的 MySQL(推荐用于正确的 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
(与AnonymousUser.is_authenticated
始终为False
相反)。这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不检查用户是否处于活动状态或是否具有有效的会话。即使通常您会在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 的格式为"<app label>.<permission codename>"
。(请参阅关于 权限 的文档)。如果用户处于非活动状态,此方法将始终返回False
。对于活动的超级用户,此方法将始终返回True
。如果传入
obj
,此方法不会检查模型的权限,而是检查此特定对象的权限。
- has_perms(perm_list, obj=None)¶
如果用户具有每个指定的权限,则返回
True
,其中每个 perm 的格式为"<app label>.<permission codename>"
。如果用户处于非活动状态,此方法将始终返回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
的用户,这些权限可以采用"<app label>.<permission codename>"
格式,也可以是Permission
实例。如果找不到具有perm
权限的用户,则返回空查询集。如果
is_active
为True
(默认值),则仅返回活动用户;如果为False
,则仅返回非活动用户。使用None
可返回所有用户,而不管其活动状态如何。如果
include_superusers
为True
(默认值),则结果将包含超级用户。如果传入
backend
并且它在AUTHENTICATION_BACKENDS
中定义,则此方法将使用它。否则,如果只有一个backend
在AUTHENTICATION_BACKENDS
中定义,则使用它;否则将引发异常。
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
如果已向
authenticate()
提供HttpRequest
对象。
身份验证后端¶
本节详细介绍了Django自带的身份验证后端。有关如何使用它们以及如何编写自己的身份验证后端的更多信息,请参阅用户认证指南的其他认证来源部分。
可用的身份验证后端¶
以下后端可在 django.contrib.auth.backends
中使用
- class BaseBackend[source]¶
提供所有必需方法的默认实现的基类。默认情况下,它将拒绝任何用户并且不提供任何权限。
- get_all_permissions(user_obj, obj=None)[source]¶
使用
get_user_permissions()
和get_group_permissions()
获取user_obj
拥有的权限字符串集。
- has_perm(user_obj, perm, obj=None)[source]¶
使用
get_all_permissions()
检查user_obj
是否具有权限字符串perm
。
- class ModelBackend[source]¶
这是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)[source]¶
尝试使用
password
通过调用User.check_password
来验证username
。如果没有提供username
,则尝试使用键CustomUser.USERNAME_FIELD
从kwargs
中获取用户名。返回已验证的用户或None
。request
是一个HttpRequest
对象,如果没有提供给authenticate()
(它会将请求传递给后端),则可能为None
。
- get_user_permissions(user_obj, obj=None)[source]¶
返回
user_obj
用户自身权限所拥有的权限字符串集合。如果is_anonymous
或is_active
为False
,则返回空集合。
- get_group_permissions(user_obj, obj=None)[source]¶
返回
user_obj
所属组的权限中拥有的权限字符串集合。如果is_anonymous
或is_active
为False
,则返回空集合。
- get_all_permissions(user_obj, obj=None)[source]¶
返回
user_obj
拥有的权限字符串集合,包括用户权限和组权限。如果is_anonymous
或is_active
为False
,则返回空集合。
- has_perm(user_obj, perm, obj=None)[source]¶
使用
get_all_permissions()
检查user_obj
是否拥有权限字符串perm
。如果用户没有is_active
,则返回False
。
- user_can_authenticate()[source]¶
返回用户是否允许进行身份验证。为了匹配
AuthenticationForm
的行为,该表单prohibits inactive users from logging in
,此方法对于is_active=False
的用户返回False
。没有is_active
字段的自定义用户模型是允许的。
- with_perm(perm, is_active=True, include_superusers=True, obj=None)[source]¶
返回所有具有权限
perm
的活动用户,权限格式为"<app label>.<permission codename>"
或Permission
实例。如果没有找到拥有perm
权限的用户,则返回空查询集。如果
is_active
为True
(默认值),则仅返回活动用户;如果为False
,则仅返回非活动用户。使用None
可返回所有用户,而不管其活动状态如何。如果
include_superusers
为True
(默认值),则结果将包含超级用户。
- class AllowAllUsersModelBackend[source]¶
与
ModelBackend
相同,只是它不拒绝非活动用户,因为user_can_authenticate()
始终返回True
。使用此后端时,您可能需要自定义
AuthenticationForm
(LoginView
使用),方法是覆盖confirm_login_allowed()
方法,因为它会拒绝非活动用户。
- class RemoteUserBackend[source]¶
使用此后端可以利用 Django 外部的身份验证机制。它使用
request.META['REMOTE_USER']
中传递的用户名进行身份验证。请参阅 Authenticating against REMOTE_USER 文档。如果您需要更多控制,您可以创建自己的身份验证后端,该后端继承自此类并覆盖这些属性或方法。
- create_unknown_user¶
True
或False
。确定如果数据库中不存在用户对象是否创建它,默认为True
。
- authenticate(request, remote_user)[source]¶
作为
remote_user
传递的用户名被认为是可信的。此方法返回具有给定用户名的用户对象,如果create_unknown_user
为True
,则创建新的用户对象。如果
create_unknown_user
为False
且数据库中未找到具有给定用户名 的User
对象,则返回None
。request
是一个HttpRequest
对象,如果没有提供给authenticate()
(它会将请求传递给后端),则可能为None
。
- configure_user(request, user, created=True)[source]¶
在每次身份验证尝试时配置用户。此方法在获取或创建正在进行身份验证的用户后立即调用,可用于执行自定义设置操作,例如根据 LDAP 目录中的属性设置用户的组。返回用户对象。
设置可以在用户创建时执行一次(
created
为True
)或在现有用户上执行(created
为False
),作为同步远程系统和本地系统之间属性的一种方式。request
是一个HttpRequest
对象,如果没有提供给authenticate()
(它会将请求传递给后端),则可能为None
。
- user_can_authenticate()¶
返回用户是否允许进行身份验证。对于
is_active=False
的用户,此方法返回False
。没有is_active
字段的自定义用户模型是被允许的。
- class AllowAllUsersRemoteUserBackend[source]¶
与
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()
函数。