django.contrib.auth
¶
本文档提供了 Django 身份验证系统组件的 API 参考资料。有关如何使用这些组件或如何自定义身份验证和授权的更多详细信息,请参阅 身份验证主题指南。
User
模型¶
-
class
models.
User
¶
字段¶
-
class
models.
User
User
对象具有以下字段-
username
¶ 必需。150 个字符或更少。用户名可能包含字母数字、
_
、@
、+
、.
和-
字符。对于许多用例,
max_length
应该足够了。如果您需要更长的长度,请使用 自定义用户模型。如果您在utf8mb4
编码(建议用于适当的 Unicode 支持)下使用 MySQL,请最多指定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
()¶ 将用户标记为未设置密码。这与将密码设为空字符串不同。此用户的
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
中定义了它,则此方法将使用它。否则,它将使用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
。
- id 始终为
实际上,你可能不需要自己使用 AnonymousUser
对象,但它们由 Web 请求使用,如下一节中所述。
验证器¶
-
类
验证器.
ASCII 用户名验证器
¶ 一个字段验证器,除了
@
、.
、+
、-
和_
之外,只允许 ASCII 字母和数字。
-
类
验证器.
Unicode 用户名验证器
¶ 一个字段验证器,除了
@
、.
、+
、-
和_
之外,允许 Unicode 字符。这是User.username
的默认验证器。
登录和注销信号¶
身份验证框架使用以下 信号,这些信号可在用户登录或注销时用于通知。
-
user_logged_in
¶ 在用户成功登录时发送。
随此信号发送的参数
发件人
- 刚登录的用户类。
请求
- 当前
HttpRequest
实例。 用户
- 刚登录的用户实例。
-
user_logged_out
¶ 在调用注销方法时发送。
发件人
- 如上所述:刚注销的用户类或
无
(如果用户未经身份验证)。 请求
- 当前
HttpRequest
实例。 用户
- 刚注销的用户实例或
无
(如果用户未经身份验证)。
-
user_login_failed
¶ 用户登录失败时发送
发件人
- 用于身份验证的模块名称。
credentials
- 包含传递给
authenticate()
或您自己的自定义身份验证后端的用户凭据的关键字参数的字典。与一组“敏感”模式(包括密码)匹配的凭据不会作为信号的一部分以明文形式发送。 请求
- 如果向
authenticate()
提供了HttpRequest
对象,则提供该对象。
身份验证后端¶
本节详细介绍了 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 指定的字段(请参阅 自定义用户和身份验证)。
它还处理为
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
。
-
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
,形式为"<app label>.<permission codename>"
或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
。
-
clean_username
(username)¶ 在使用
username
获取或创建用户对象之前,对其执行任何清理(例如,剥离 LDAP DN 信息)。返回清理后的用户名。
-
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
。
实用程序函数¶
-
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 4.1.8 中已更改添加了使用
SECRET_KEY_FALLBACKS
的后备验证。在 Django 5.0 中更改添加了
aget_user()
函数。