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
    
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/13553947.html
Copyright © 2011-2022 走看看