zoukankan      html  css  js  c++  java
  • Django

    Django - auth模块(认证系统)

    前言

    Django 默认已经提供了 认证系统 auth 模块。认证系统包含

    • 用户管理
    • 权限管理(RBAC)
    • 用户组
    • 密码哈希系统
    • 一个可插拔的后台管理系统(admin)

    Django默认用户的认证机制依赖Session机制,也就是说 不是前后端分离的项目 用session会比较不错。

    我们在项目中将引入JWT认证机制,将用户的身份凭据存放在Token中,然后对接Django的认证系统,帮助我们来实现:

    • 用户的数据模型
    • 用户密码的加密与验证
    • 用户的权限系统

    Django 用户模型类

    Django认证系统中提供了用户模型类User保存用户的数据,默认的User包含以下常见的基本字段:

    字段名 字段描述
    username 必选。150个字符以内。 用户名可能包含字母数字,_@+ .-个字符。
    first_name 可选(blank=True)。 少于等于30个字符。
    last_name 可选(blank=True)。 少于等于30个字符。
    email 可选(blank=True)。 邮箱地址。
    password 必选。 密码的哈希加密串。 (Django 不保存原始密码)。 原始密码可以无限长而且可以包含任意字符。
    groups Group 之间的多对多关系。
    user_permissions Permission 之间的多对多关系。
    is_staff 布尔值。 设置用户是否可以访问Admin 站点。
    is_active 布尔值。 指示用户的账号是否激活。 它不是用来控制用户是否能够登录,而是描述一种帐号的使用状态。
    is_superuser 是否是超级用户。超级用户具有所有权限。
    last_login 用户最后一次登录的时间。
    date_joined 账户创建的时间。 当账号创建时,默认设置为当前的date/time。

    image-20200824101808246

    自动帮我们生成了数据模型类,也就是说我们可以借用他自定义好的数据模型。

    也帮我们定义好了一些内置方法,直接操作我们好的数据模型类,AbstractUser

    常用方法

    • set_password(raw_password)

      设置用户的密码为给定的原始字符串,并负责密码的。 不会保存User 对象。当Noneraw_password 时,密码将设置为一个不可用的密码。

    • check_password(raw_password)

      如果给定的raw_password是用户的真实密码,则返回True,可以在校验用户密码时使用。

    管理器方法

    管理器方法即可以通过User.objects. 进行调用的方法。

    • create_user(username, email=None, password=None, ***extra_fields*)

      创建、保存并返回一个User对象。

    • create_superuser(username, email, password, ***extra_fields*)

      create_user() 相同,但是设置is_staffis_superuserTrue

    创建用户模型的子应用

    cd luffyapi/apps/
    python ../../manage.py startapp users
    

    在settings.py文件中注册子应用

    INSTALLED_APPS = [
    		...
      	'users',
    ]
    

    自定义的用户模型类

    在users/models.py 下

    注意⚠️:

    django 认证系统中提供的用户模型类及方法很方便,我们可以使用这个模型类,但是字段无法瞒住我们的需求,如果我们项目中需要手机号,就需要添加额外的字段。
    

    Django提供了django.contrib.auth.models.AbstractUser用户抽象模型类允许我们继承,扩展字段来使用Django认证系统的用户模型类。

    继承AbstractUser

    在创建好的应用models.py中定义用户的用户模型类。

    class User(AbstractUser):
        """用户模型类"""
        mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    
        class Meta:
            db_table = 'ly_users'
            verbose_name = '用户'
            verbose_name_plural = verbose_name
    

    我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。

    在配置文件(settings.py)中进行设置

    AUTH_USER_MODEL = 'users.User'
    

    AUTH_USER_MODEL 参数的设置以点.来分隔,表示应用名.模型类名

    注意⚠️:

    Django建议我们对于AUTH_USER_MODEL参数的设置一定要在**第一次数据库迁移之前就设置**好,否则后续使用可能出现未知错误
    

    执行数据库迁移

    python manage.py makemigrations
    python manage.py migrate
    

    执行python manage.py migrate命令时:系统报错类似如下:

    image-20200824104741490

    django.db.migrations.exceptions.InconsistentMigrationHistory: Migration reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency users.0001_initial on database 'default'.
    

    分析报错:

    这是表示有一个叫reversion的子应用使用了原来的废弃的users模型reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency, users.0001_initial on database 'default'.

    但是目前数据库已经设置了默认的子应用User,也就是在我们项目中第一次数据迁移的时候就已经生成了Auth模型数据

    image-20200824105317669

    所以产生了冲突。那么这种冲突,我们需要清除原来的迁移文件和数据库中的所有信息就可以解决了

    解决步骤

    1.备份数据库删除原来的数据表信息

    备份数据库,删除关于用户原来的数据表信息和表结构[如果刚开始开发,则直接清除库中所有数据表即可。]

    备份数据库

    docker exec -it mysql-test  mysqldump -uroot -p123456 -t luffy > /Users/jiangchunsheng/Desktop/项目简历/LuffycityProject/luffycapi/logs/luffy_.sql
    

    清除数据库中所有表结构

    mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM TABLES WHERE TABLE_SCHEMA='eab12'" | mysql -f eab1
    

    image-20200824143315851

    直接用pycharm 删除也是可以的,方便还快捷。

    2.删除子应用users中migrations目录下除了__init__.py以外的所有迁移文件

    image-20200824143717700

    3.删除在django.contrib.admin和django.contrib.auth模块里面的migrations迁移文件,除了__init__.py

    django.contrib.admin.migrations

    image-20200824143942365

    django.contrib.auth.migrations

    4.删除在xadmin和reversion模块中的migrations的迁移文件,除了__init__.py

    image-20200824144504392

    5.执行数据迁移,把备份数据,除了用户以外的全部恢复执行即可

    python manage.py makemigrations
    python manage.py migrate
    

    6. 使用manage.py createsuperuser创建管理员即可

    python manage.py createsuperuser
    
  • 相关阅读:
    Robot Framework(一)安装笔记
    Postman之获得登录的token,并设置为全局变量
    Postman之简单使用
    Postman之前言
    LoadRunner之使用JSEESIONID访问网站
    Jmeter之逻辑控制器/定时器
    android 解决小米手机上选择照片路径为null情况
    spring MVC学习之二
    Spring MVC学习一
    Struts学习总结(一)
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/13553947.html
Copyright © 2011-2022 走看看