一、简介
Django 身份验证同时提供身份验证和授权,通常称为身份验证系统
二、user对象
User
对象是认证系统的核心。代表与站点交互的人,并用于启用诸如限制访问、注册用户配置文件、将内容与创建者关联等。在 Django 的身份验证框架中只存在一类用户,即'superusers'
管理员'staff'
用户只是具有特殊属性集,而不是不同类别的用户对象。
1、默认用户的主要属性及其他字段
username #必需的。150 个字符或更少。用户名可以包含字母数字、 、_
、@
和字符。+
.
-
password #必需的。密码的哈希值和有关密码的元数据。(Django 不存储原始密码。)原始密码可以任意长并且可以包含任何字符
email #可选 ( blank=True
)。电子邮件地址。
first_name #可选 ( blank=True
)。150 个字符或更少
last_name #可选 ( blank=True
)。150 个字符或更少。
groups #多对多关系Group
user_permissions #多对多关系Permission
is_staff #布尔值。指定此用户是否可以访问管理站点
is_active #布尔值。指定是否应将此用户帐户视为活动帐户
is_superuser #布尔值。指定此用户拥有所有权限,而无需显式分配
last_login #用户上次登录的日期时间
date_joined #指定帐户创建时间的日期时间。创建帐户时默认设置为当前日期/时间。
2、方法
get_username() 返回用户的用户名。 get_full_name() 返回first_name加号last_name,中间有一个空格。 get_short_name() 返回first_name. set_password( raw_password ) 将用户的密码设置为给定的原始字符串,注意密码散列。不保存 User对象。当raw_passwordisNone时,密码将被设置为无法使用的密码,就像 set_unusable_password() 使用过一样。 check_password( raw_password ) 返回True给定的原始字符串是否是用户的正确密码。 set_unusable_password() 将用户标记为未设置密码。这与密码的空白字符串不同。 check_password()因为这个用户永远不会回来True。不保存 User对象。 has_usable_password() False如果 set_unusable_password()已为此用户调用,则返回。 get_user_permissions( obj =无) 返回用户直接拥有的一组权限字符串。如果obj传入,则只返回此特定对象的用户权限。 get_group_permissions( obj =无) 返回用户通过他们的组拥有的一组权限字符串。如果obj传入,则只返回此特定对象的组权限。 get_all_permissions( obj =无) 通过组和用户权限返回用户拥有的一组权限字符串。如果obj传入,则仅返回此特定对象的权限。 has_perm(perm, obj =无) 返回True用户是否具有指定的权限,其中 perm 的格式为,如果用户处于非活动状态,此方法将始终返回。对于活动的超级用户,此方法将始终返回."<app label>.<permission codename>"FalseTrue,如果obj传入,则此方法不会检查模型的权限,而是检查此特定对象的权限。 has_perms( perm_list , obj = None ) 返回True用户是否具有每个指定的权限,其中每个权限的格式为 。如果用户处于非活动状态,此方法将始终返回。对于活动的超级用户,此方法将始终返回."<app label>.<permission codename>"FalseTrue,如果obj传入,则此方法不会检查模型的权限,而是检查特定对象的权限。 has_module_perms(包名) True如果用户在给定包(Django 应用标签)中具有任何权限,则返回。如果用户处于非活动状态,此方法将始终返回False。对于活动的超级用户,此方法将始终返回True. email_user(主题,消息,from_email = None,** kwargs) 向用户发送电子邮件。如果from_email是None,Django 使用DEFAULT_FROM_EMAIL. 任何**kwargs都传递给基础send_mail()调用。
3、创建用户
#创建用户最直接的方法是使用包含的 create_user()辅助函数: from django.contrib.auth.models import User user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword') user.last_name = 'Lennon' user.save()
4、创建超级用户
python manage.py createsuperuser --username=joe --email=joe@example.com
5、修改密码
Django 不在用户模型上存储原始(明文)密码,而仅存储哈希
from django.contrib.auth.models import User u = User.objects.get(username='john') u.set_password('new password') u.save()
#如果您安装了 Django 管理员,可以在身份验证系统的管理页面上更改用户密码。#Django 还提供了视图和表单,可用于允许用户更改自己的密码。
6、验证用户
用于authenticate()
验证一组凭据。它将凭据作为关键字参数,username
对于 password
默认情况,针对每个 身份验证后端User
检查它们,如果凭据对后端有效,则返回一个 对象。如果凭据对任何后端都无效,或者后端引发PermissionDenied
,则返回None
from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: # A backend authenticated the credentials else: # No backend authenticated the credentials
7、权限和授权
Django 带有一个内置的权限系统。它提供了一种将权限分配给特定用户和用户组的方法。
它由 Django 管理站点使用,也可以在自己的代码中使用它。
Django 管理站点使用权限如下
查看对象的访问权限仅限于对该类型对象具有“查看”或“更改”权限的用户。
查看“添加”表单和添加对象的访问权限仅限于对该类型对象具有“添加”权限的用户。
查看更改列表、查看“更改”表单和更改对象的访问权限仅限于对该类型对象具有“更改”权限的用户。
删除对象的权限仅限于对该类型对象具有“删除”权限的用户。
不仅可以按对象类型设置权限,还可以按特定对象实例设置权限。通过使用 类提供的has_view_permission()
、 和 方法has_add_permission()
, 可以为相同类型的不同对象实例自定义权限。has_change_permission()
has_delete_permission()
ModelAdmin
User
对象有两个多对多字段:groups
和user_permissions
. 对象可以像任何其他Django 模型User
一样访问它们的相关对象:
myuser.groups.set([group_list])
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()
8、登录
如果您有想要附加到当前会话的经过身份验证的用户 - 这是通过login()
函数完成的。
它需要一个HttpRequest
对象和一个 User
对象。 login()
使用 Django 的会话框架将用户的 ID 保存在会话中。
请注意,匿名会话期间的任何数据集都会在用户登录后保留在会话中。
from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. ...
9、注销用户
要注销已通过 登录的用户, 视图中django.contrib.auth.login()
使用 。django.contrib.auth.logout()
它接受一个 HttpRequest
对象并且没有返回值。例子:
from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.
更多详情请参考django官网https://docs.djangoproject.com/en/4.1/topics/auth/default/#permission-caching
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通