Django | Authentication | 默认用户认证
前言:
Django自带一个用户认证系统,用于处理用户账户、群组、许可和基于cookie的用户会话。
一、django默认的用户认证系统
1,Django的认证系统包含了身份验证和权限管理两部分。
认证:验证一个用户是否它声称的那个人,可用于账号登录。
授权:授权决定一个通过了认证的用户被允许做什么。
2,Django认证系统位置
django.contrib.auth 包含认证框架的核心和默认的模型。
django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。
3,Django认证系统包含的内容:
用户:用户模型类、用户认证。
权限:标识一个用户是否可以做一个特定的任务,MIS系统常用到。
组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。
密码:一个可配置的密码哈希系统,设置密码、密码校验。
注意:如果有一下情况,可以使用第三方包:
密码强度检查
登录请求限制
第三方认证
二、Django默认用户模型类
1, Django认证系统中提供了用户模型类User保存用户的数据。
User对象是认证系统的核心。
2, Django认证系统用户模型类位置
django.contrib.auth.models.User
06Django默认用户模型类.png
Django用户认证系统中的用户模型类可以自定义,继承自AbstractUser。
- 父类AbstractUser介绍
- User对象基本属性
创建用户(注册用户)必选: username、password
创建用户(注册用户)可选:email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse
判断用户是否通过认证(是否登录):is_authenticated
- 创建用户(注册用户)的方法
user = User.objects.create_user(username, email, password, **extra_fields)
- 用户认证(用户登录)的方法
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password, **kwargs)
- 处理密码的方法
设置密码:set_password(raw_password)
校验密码:check_password(raw_password)
思考1:为什么Django默认用户模型类是User?
django.conf.global_settings
AUTH_USER_MODEL = 'auth.User'
配置规则:
AUTH_USER_MODEL = '应用名.模型类名'
Django用户模型类是通过全局配置项 AUTH_USER_MODEL 决定的
思考2:当项目注册数据中,mobile必填时,怎么办?
可以自定义用户模型类。继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知),新增mobile字段。
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
"""自定义用户模型类"""
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
用户模型类创建好后
- 1,通过以下命令生成迁移文件
python manage.py makemigrations
- 2,执行迁移文件,生成表
python manage.py migrate
三、在Web请求中的认证
每一次请求中都包含一个request.user属性。如果该用户未登陆,该属性的值是AnonymousUser,如果已经登录,该属性就是一个User模型的实例。
可以使用is_authenticated方法进行判断,如下:
if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
1,登录用户:此时我们假设:用户注册成功后即表示用户认证通过,对他进行状态保持。
login(request, user, backend=None)
在视图中,使用login()方法登录用户。它接收一个HttpRequest参数和一个User对象参数。该方法会把用户的ID保存在Django的session中。下面是一个认证和登陆的例子:
# 保存注册数据
try:
user = User.objects.create_user(username=username, password=password, mobile=mobile)
except DatabaseError:
return render(request, 'register.html', {'register_errmsg': '注册失败'})
# 实现状态保持
login(request, user)
# 响应注册结果
return redirect(reverse('contents:index'))
12session浏览器.png
13sessionredis.png
2,注销用户
logout(request)
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
注意:注意,被logout的用户如果没登录,不会抛出错误。
一旦logout,当前请求中的session数据都会被清空。