【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客
《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)
Django 5框架Web应用开发_夏天又到了的博客-CSDN博客
Django身份验证同时提供身份验证和授权,由于这些功能有些耦合,因此通常称之为身份验证系统。
9.3.1 用户对象介绍
用户对象是身份验证系统的核心,通常代表与网站进行交互的人员,并用于启用类似限制访问权限、注册用户个人资料、将内容与创建者相关联等场景。
Django身份验证系统中仅存在一类用户,即超级用户(Superusers)或管理员用户这类设置了特殊属性的用户对象,而不是不同类的用户对象。默认的用户对象主要包括以下属性:
Username
Password
first_name
last_name
更详细的说明请参阅完整的官方API文档。
9.3.2 创建用户对象
创建用户对象最直接方法就是直接使用用户内置的create_user()函数,具体代码如下:
【代码9-1】
01 >>> from django.contrib.auth.models import User
02 >>> user = User.objects.create_user('king', 'king@email.com', 'kingpwd')
03 # At this point, user is a User object that has already been saved
04 # to the database. You can continue to change its attributes
05 # if you want to change other fields.
06 >>> user.last_name = 'wang'
07 >>> user.save()
【代码分析】
在第01行代码中,通过import关键字引入了User模块。
在第02行代码中,通过create_user()函数创建了一个Users对象的用户user。
在第06行代码中,为用户user定义了last_name属性。
在第07行代码中,调用save()方法保存用户数据信息。
9.3.3 创建超级用户
创建超级用户(superuser)是在命令行中通过createsuperuser命令实现的,具体命令行指令如下:
python manage.py createsuperuser --username=king --email=king@example.com
输入上述指令后,系统将提示用户输入密码,输入完成后将立即创建用户。如果在上述指令中不使用"--username"或"--email"选项,则命令执行过程中将会提示用户输入这些选项值。
9.3.4 更改密码
Django框架不会在用户模型上存储原始(明文)密码,而仅存储一个hash散列密码。因此,请勿尝试直接操作用户的密码属性,这也是创建用户时使用辅助功能的原因。
如果想更改用户密码,主要可以通过以下几种方式:
- 命令行方式
在命令行中,通过changepassword命令可以更改用户密码,具体命令行指令如下:
python manage.py changepassword --username=king
输入上述指令后,命令执行过程中会提示用户更改给定用户的密码,而且必须重复输入两次(用于校验)。如果两次密码相匹配,则新密码将立即生效。如果指令中不指定用户,则该指令将尝试更改用户名与当前系统用户匹配的密码。
- 编程方式
我们可以在代码中使用set_password()函数方法,以编程方式更改密码,具体代码如下:
【代码9-2】
01 >>> from django.contrib.auth.models import User
02 >>> u = User.objects.get(username='king')
03 >>> u.set_password('your-new-password')
04 >>> u.save()
- 管理员系统方式
如果已经安装了Django管理员,则还可以在身份验证系统的管理页面上更改用户的密码。
- 视图和表单方式
Django框架还提供了视图和表单,用于允许用户更改自己的密码。
9.3.5 验证用户
Django框架使用authenticate()方法来验证一组凭据。关于authenticate()方法的语法说明如下:
authenticate(request=None, **credentials)
该方法在默认情况下使用凭据作为关键字参数、用户名和密码,并针对每个身份验证后端进行检查,如果凭据对后端有效,则返回User对象;如果凭据对于任何后端均无效,或者后端会引发PermissionDenied异常,则返回None。代码示例如下:
【代码9-3】
01 from django.contrib.auth import authenticate
02 user = authenticate(username='king', password='your secret password')
03 if user is not None:
04 # A backend authenticated the credentials
05 else:
06 # No backend authenticated the credentials
request是一个可选的HttpRequest,通过身份验证被传递给后端的authenticate()方法。
9.3.6 默认权限
当在Django项目配置文件中的INSTALLED_APPS设置选项中添加django.contrib.auth模块时,该模块将为已安装的一个应用中定义的模型创建4个默认权限,即添加、更改、删除和查看。
上述4个权限将会在运行python manage.py migrate命令后被创建。将django.contrib.auth模块添加到INSTALLED_APPS设置选项后,第一次运行迁移(migrate)命令时将为所有先前安装的模型以及当时正在安装的所有新模型创建默认权限。然后,在每次运行迁移(migrate)命令时会为新模型创建默认权限。
假定有一个带有App标签名称foo和模型名称Bar的应用程序,如果要测试其基本权限,则应使用如下方法:
add: user.has_perm('foo.add_bar')
change: user.has_perm('foo.change_bar')
delete: user.has_perm('foo.delete_bar')
view: user.has_perm('foo.view_bar')
另外,权限模型很少会被直接访问。
9.3.7 用户组
用户组对象与用户一样,也是身份验证系统的核心。使用django.contrib.auth.models.Group模型是对用户进行分组的通用方法,可以向同一个组内的用户应用权限或其他标签。一个用户可以属于任意数量的用户组。
用户组中的用户会自动拥有授予该组的权限。例如,如果站点编辑器组具有can_edit_home_page权限,则该用户组中的任何用户都将具有该权限。
除了权限之外,用户组是对用户进行分组并为其提供一些标签或扩展功能的便捷方法。例如,可以创建一个"特殊用户"组并编写代码,使其可以访问网站中仅为成员的部分,或向其发送仅为成员的电子邮件。
9.3.8 权限与授权
Django框架带有内置的权限系统,其提供了一种将权限分配给特定用户和用户组的方法。Django权限与授权由后台管理使用,不过也推荐在自己的代码中来使用。Django框架的后台管理使用以下权限:
- 对视图对象的访问仅限于对该类型对象具有"视图"或"更改"权限的用户。
- 只有对该对象类型具有"添加"权限的用户,才能查看添加的表单和添加的对象。
- 只有对该对象类型具有"更改"权限的用户,才能查看更改的列表和更改的对象。
- 删除对象的权限,仅限于对该对象类型具有"删除"权限的用户。
此外,不仅可以按照对象类型设置权限,还可以按照特定对象实例设置权限。通过使用ModelAdmin模型类提供的has_view_permission()、has_add_permission()、has_change_permission()和has_delete_permission()方法,可以为同一类型的不同对象实例自定义权限。
当用户对象具有两个多对多字段(组和用户权限)时,用户对象可以使用与任何其他Django模型相同的方式来访问其相关对象,代码示例如下:
【代码9-4】
01 myuser.groups.set([group_list])
02 myuser.groups.add(group, group, ...)
03 myuser.groups.remove(group, group, ...)
04 myuser.groups.clear()
05 myuser.user_permissions.set([permission_list])
06 myuser.user_permissions.add(permission, permission, ...)
07 myuser.user_permissions.remove(permission, permission, ...)
08 myuser.user_permissions.clear()
9.3.9 Web请求中的身份验证
Django框架使用会话和中间件将身份验证系统挂接到请求对象(request)中,在代表当前用户的每个请求上提供一个request.user属性。如果当前用户尚未登录,则此属性将设置为AnonymousUser类的实例,否则将是User类的实例。
可以使用is_authenticated属性来进行区分,代码示例如下:
【代码9-5】
01 if request.user.is_authenticated:
02 # Do something for authenticated users.
03 ...
04 else:
05 # Do something for anonymous users.
06 ...
9.3.10 在管理员中管理用户
在Django框架中,如果同时安装了django.contrib.admin和django.contrib.auth模块,那么管理员将提供一种方便的方式来查看和管理用户、组和权限。
此时,可以像创建任何Django模型一样创建和删除用户,还可以创建组,并且可以将权限分配给用户或组。
此外,用户在Django后台管理内进行模型编辑的日志也将被存储和显示。