Django | Authentication | 默认用户认证系统

python基础

浏览数:305

2019-10-10

前言:

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数据都会被清空。

作者:CarryLili