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

password

必填。密码的哈希值及其元数据。(Django 不存储原始密码。)原始密码可以任意长,并且可以包含任何字符。此字段中的元数据可能会将密码标记为不可用。请参阅密码文档

groups

Group 的多对多关系

user_permissions

Permission 的多对多关系

is_staff

布尔值。允许此用户访问管理员站点。

is_active

布尔值。将此用户帐户标记为活动状态。我们建议您将此标志设置为 False,而不是删除帐户。这样,如果您的应用程序有任何指向用户的外部键,则外部键就不会断开。

这并不一定控制用户是否可以登录。身份验证后端不需要检查 is_active 标志,但默认后端(ModelBackend)和 RemoteUserBackend 会检查。如果您想允许非活动用户登录,可以使用 AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend。在这种情况下,您还需要自定义 AuthenticationFormLoginView 使用此表单),因为它会拒绝非活动用户。请注意,权限检查方法(例如 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。这是一种区分 UserAnonymousUser 对象的方法。通常,您应该优先使用 is_authenticated 属性。

方法

class models.User
get_username()

返回用户的用户名。由于可以交换 User 模型,因此您应该使用此方法而不是直接引用用户名属性。

get_full_name()

返回 first_namelast_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 的格式为 "<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

用户名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_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中定义,则此方法将使用它。否则,如果只有一个backendAUTHENTICATION_BACKENDS中定义,则使用它;否则将引发异常。

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

如果已向 authenticate() 提供 HttpRequest 对象。

身份验证后端

本节详细介绍了Django自带的身份验证后端。有关如何使用它们以及如何编写自己的身份验证后端的更多信息,请参阅用户认证指南的其他认证来源部分

可用的身份验证后端

以下后端可在 django.contrib.auth.backends 中使用

class BaseBackend[source]

提供所有必需方法的默认实现的基类。默认情况下,它将拒绝任何用户并且不提供任何权限。

get_user_permissions(user_obj, obj=None)[source]

返回一个空集。

get_group_permissions(user_obj, obj=None)[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指定字段(请参见自定义用户和身份验证)。

它还处理为 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)[source]

尝试使用 password 通过调用 User.check_password 来验证 username。如果没有提供 username,则尝试使用键 CustomUser.USERNAME_FIELDkwargs 中获取用户名。返回已验证的用户或 None

request 是一个 HttpRequest 对象,如果没有提供给 authenticate()(它会将请求传递给后端),则可能为 None

get_user_permissions(user_obj, obj=None)[source]

返回 user_obj 用户自身权限所拥有的权限字符串集合。如果 is_anonymousis_activeFalse,则返回空集合。

get_group_permissions(user_obj, obj=None)[source]

返回 user_obj 所属组的权限中拥有的权限字符串集合。如果 is_anonymousis_activeFalse,则返回空集合。

get_all_permissions(user_obj, obj=None)[source]

返回 user_obj 拥有的权限字符串集合,包括用户权限和组权限。如果 is_anonymousis_activeFalse,则返回空集合。

has_perm(user_obj, perm, obj=None)[source]

使用 get_all_permissions() 检查 user_obj 是否拥有权限字符串 perm。如果用户没有 is_active,则返回 False

has_module_perms(user_obj, app_label)[source]

返回 user_obj 是否在应用 app_label 上有任何权限。

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_activeTrue(默认值),则仅返回活动用户;如果为False,则仅返回非活动用户。使用None可返回所有用户,而不管其活动状态如何。

如果include_superusersTrue(默认值),则结果将包含超级用户。

class AllowAllUsersModelBackend[source]

ModelBackend 相同,只是它不拒绝非活动用户,因为 user_can_authenticate() 始终返回 True

使用此后端时,您可能需要自定义 AuthenticationFormLoginView 使用),方法是覆盖 confirm_login_allowed() 方法,因为它会拒绝非活动用户。

class RemoteUserBackend[source]

使用此后端可以利用 Django 外部的身份验证机制。它使用 request.META['REMOTE_USER'] 中传递的用户名进行身份验证。请参阅 Authenticating against REMOTE_USER 文档。

如果您需要更多控制,您可以创建自己的身份验证后端,该后端继承自此类并覆盖这些属性或方法。

create_unknown_user

TrueFalse。确定如果数据库中不存在用户对象是否创建它,默认为 True

authenticate(request, remote_user)[source]

作为 remote_user 传递的用户名被认为是可信的。此方法返回具有给定用户名的用户对象,如果 create_unknown_userTrue,则创建新的用户对象。

如果create_unknown_userFalse 且数据库中未找到具有给定用户名 的User 对象,则返回 None

request 是一个 HttpRequest 对象,如果没有提供给 authenticate()(它会将请求传递给后端),则可能为 None

clean_username(username)[source]

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

configure_user(request, user, created=True)[source]

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

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

request 是一个 HttpRequest 对象,如果没有提供给 authenticate()(它会将请求传递给后端),则可能为 None

user_can_authenticate()

返回用户是否允许进行身份验证。对于is_active=False 的用户,此方法返回 False。没有is_active 字段的自定义用户模型是被允许的。

class AllowAllUsersRemoteUserBackend[source]

RemoteUserBackend 相同,只是它不拒绝无效用户,因为user_can_authenticate 始终返回 True

实用函数

get_user(request)[source]
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() 函数。

返回顶部