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
原文地址:https://www.cnblogs.com/jiangchunsheng/p/13553947.html