Django - auth模块(认证系统)
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。 |
自动帮我们生成了数据模型类,也就是说我们可以借用他自定义好的数据模型。
也帮我们定义好了一些内置方法,直接操作我们好的数据模型类,AbstractUser
常用方法
-
set_password
(raw_password)设置用户的密码为给定的原始字符串,并负责密码的。 不会保存
User
对象。当None
为raw_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_staff
和is_superuser
为True
。
创建用户模型的子应用
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
命令时:系统报错类似如下:
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
模型数据。
所以产生了冲突。那么这种冲突,我们需要清除原来的迁移文件和数据库中的所有信息就可以解决了。
解决步骤
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
直接用pycharm 删除也是可以的,方便还快捷。
2.删除子应用users中migrations目录下除了__init__.py以外的所有迁移文件
3.删除在django.contrib.admin和django.contrib.auth模块里面的migrations迁移文件,除了__init__.py
django.contrib.admin.migrations
django.contrib.auth.migrations
4.删除在xadmin和reversion模块中的migrations的迁移文件,除了__init__.py
5.执行数据迁移,把备份数据,除了用户以外的全部恢复执行即可
python manage.py makemigrations
python manage.py migrate
6. 使用manage.py createsuperuser创建管理员即可
python manage.py createsuperuser