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)。电子邮件地址。

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()

将用户标记为未设置密码。这与将密码设为空字符串不同。此用户的 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_emailNone,Django 会使用 DEFAULT_FROM_EMAIL。任何 **kwargs 都会传递给底层的 send_mail() 调用。

管理器方法

class models.UserManager

User 模型有一个自定义管理器,它具有以下帮助程序方法(除了 BaseUserManager 提供的方法之外)

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

创建、保存并返回 User

设置 usernamepassword。自动将 email 的域部分转换为小写,返回的 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 的用户,该权限采用 "<app label>.<permission codename>" 格式或 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

字段

权限 对象具有以下字段

模型。权限
名称

必需。255 个字符或更少。示例:'可以 投票'

内容类型

必需。对 django_content_type 数据库表的引用,其中包含每个已安装模型的记录。

代码名称

必需。100 个字符或更少。示例:'can_vote'

方法

权限 对象具有与任何其他 Django 模型 一样的标准数据访问方法。

模型

模型。

字段

对象具有以下字段

模型。
名称

必需。150 个字符或更少。允许使用任何字符。示例:'优秀 用户'

权限

权限 的多对多字段

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

验证器

验证器.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 指定的字段(请参阅 自定义用户和身份验证)。

它还处理为 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 尝试使用 passwordusername 进行身份验证。如果没有提供 username,它将尝试使用键 CustomUser.USERNAME_FIELDkwargs 中获取用户名。返回经过身份验证的用户或 None

requestHttpRequest,如果未提供给 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,形式为 "<app label>.<permission codename>"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

requestHttpRequest,如果未提供给 authenticate()(它会将其传递给后端),则可能为 None

clean_username(username)

在使用 username 获取或创建用户对象之前,对其执行任何清理(例如,剥离 LDAP DN 信息)。返回清理后的用户名。

configure_user(request, user, created=True)

在每次身份验证尝试时配置用户。此方法在获取或创建正在验证的用户后立即调用,可用于执行自定义设置操作,例如根据 LDAP 目录中的属性设置用户的组。返回用户对象。

设置可以在用户创建时执行一次(createdTrue)或在现有用户上执行(createdFalse)作为在远程和本地系统之间同步属性的一种方式。

requestHttpRequest,如果未提供给 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() 函数。

返回顶部