美文网首页
Django-便捷的用户认证系统

Django-便捷的用户认证系统

作者: 越大大雨天 | 来源:发表于2019-05-26 16:43 被阅读0次

    Django默认用户认证系统

    1. Django自带用户认证系统
    • 它处理用户账号、组、权限以及基于cookie的用户会话。
    1. Django认证系统位置
    • django.contrib.auth包含认证框架的核心和默认的模型。
    • django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。
    1. Django认证系统同时处理认证和授权
    • 认证:验证一个用户是否它声称的那个人,可用于账号登录。
    • 授权:授权决定一个通过了认证的用户被允许做什么。
    1. Django认证系统包含的内容
    • 用户:用户模型类、用户认证。
    • 权限:标识一个用户是否可以做一个特定的任务,MIS系统常 用到。
    • 组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。
    • 密码:一个可配置的密码哈希系统,设置密码、密码校验。

    以上都是官方的介绍字段,比较枯燥,可先跳过。

    它可以做什么?

    1. 当需要创建用户注册models时,不再需要自己设计复杂表结构

    案例:以如下注册页面为例,我们需要的数据库字段有用户名、密码、手机号


    image.png
    • 使用Django自带的用户模型类,我们可以节省大量代码,实际定义代码如下:

      from django.db import models
      from django.contrib.auth.models import AbstractUser
      
      class User(AbstractUser):
          mobile = models.CharField(max_length=11)
      
      
    • 在settings中添加行AUTH_USER_MODEL = '应用名.模型类名'

      # 指定本项目用户模型类
      AUTH_USER_MODEL = 'users.User'  # 应用名称.模型类名称
      

    这里只是继承了AbstractUser类,并只自定义了一个手机号的字段,而其他字段都不需再定义和设计,就完成了我们需要的模型。

    • 因为父类AbstractUser已经包含了username、password、email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse这些字段,无需再次定义。
    • username、password为必选字段,其余可选。
    • 手机号字段Django中没有自带,需要我们继承AbstractUser并添加一条手机号字段即可。

    2. 当需要在数据库中添加注册用户时,不再需要自己操作数据库语法
    当用户通过注册验证后,创建用户对象只需执行下行代码:

    user = User.objects.create_user(username=username, password=password, mobile=mobile)
    

    3. 用户登录无需手动与数据库数据对比,无需对密码执行加密对比操作

    from django.contrib.auth import authenticate
    user = authenticate(username=username, password=password)
    

    3.1 自定义authenticate方法实现多账号登录

    实现能让用使用注册用户名、手机号或者邮箱完成登录验证:

    在自定义工具目录util中继承ModelBackend类,重写authenticate方法

    from django.contrib.auth.backends import ModelBackend
    import re
    from users.models import User
    
    class MeiduoModelBackend(ModelBackend):
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                # get方法查询到数据返回用户对象,未查询到则报错
                user = User.objects.get(username=username)
            except:
                try:
                    user = User.objects.get(mobile=username)
                except:
                    return None
            # 判断密码
            if user.check_password(password):
                return user
            else:
                return None
    

    4. 保持用户登录状态无需手动创建session

    from django.contrib.auth import login
    login(request, user)
    

    5.退出登录操作自动删除session

    from django.contrib.auth import logout
    logout(request)
    

    迁移用户模型类

    • 用户认证系统中的用户模型类,是通过全局配置项AUTH_USER_MODEL 决定的。
    • 如果迁移自定义用户模型类,必须先配置 AUTH_USER_MODEL 。
    • 设置自定义模型类后,必须完成迁移.
      执行迁移命令:
      python manage.py makemigrations
      python manage.py migrate
      

    迁移后,mysql数据库用户表结构如下:

    image.png

    相关文章

      网友评论

          本文标题:Django-便捷的用户认证系统

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