美文网首页
Django | Authentication | 默认用户认证

Django | Authentication | 默认用户认证

作者: CarryLili | 来源:发表于2019-08-15 00:49 被阅读0次

    前言:

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

    相关文章

      网友评论

          本文标题:Django | Authentication | 默认用户认证

          本文链接:https://www.haomeiwen.com/subject/ykbojctx.html