Django自定义Auth模块方式
Django默认提供了认证系统Auth模块,认证的时候,会使用auth模块里面给提供的表。认证系统包含:
- 用户管理
- 权限
- 用户组
- 密码哈希系统
- 用户登录或内容显示的表单和视图
- 一个可插拔的后台系统 admin
Django默认用户的认证机制依赖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。 |
上面缺少一些字段,所以后面会对它进行改造,比如说它里面没有手机号字段,后面需要加上。
常用方法:
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
。
创建用户模块的子应用
python ../../manage.py startapp users
在settings.py文件中注册子应用。
INSTALLED_APPS = [ ... ‘users‘, ]
创建自定义的用户模型类
Django认证系统中提供的用户模型类及方法很方便,可以使用这个模型类,但是字段有些无法满足项目需求,如本项目中需要保存用户的手机号,需要给模型类添加额外的字段。
Django提供了django.contrib.auth.models.AbstractUser
用户抽象模型类允许我们继承,扩展字段来使用Django认证系统的用户模型类。
可以在apps中创建Django应用users,并在配置文件中注册users应用。
在创建好的应用models.py中定义用户的用户模型类。目前是将所有用户都放到一个表里面的,比如管理员,老师(上传课程),客户等等,以后通过用户组进行用户划分
from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class User(AbstractUser): """用户模型类""" mobile = models.CharField(max_length=15, unique=True, verbose_name=‘手机号码‘) avatar = models.ImageField(upload_to=‘avatar‘,verbose_name=‘用户头像‘,null=True,blank=True) class Meta: db_table = ‘ly_user‘ verbose_name = ‘用户信息‘ verbose_name_plural = verbose_name
自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用自定义的模型类。
在配置文件中进行设置
#注册自定义用户模型,格式:“应用名.模型类名” AUTH_USER_MODEL = ‘users.User‘
AUTH_USER_MODEL
参数的设置以点.
来分隔,表示应用名.模型类名
。
注意:Django建议对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误。
执行数据库迁移
python manage.py makemigrations python manage.py migrate
如果在第一次数据迁移以后,才设置AUTH_USER_MODEL自定义用户模型,则会报错。解决方案如下:
0. 先把现有的数据库导出备份,然后清掉数据库中所有的数据表。 1. 把开发者创建的所有子应用下面的migrations目录下除了__init__.py以外的所有迁移文件,只要涉及到用户的,一律删除,并将django-migrations表中的数据全部删除。 2. 把django.contrib.admin.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。 3. 把django.contrib.auth.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。 4. 把reversion.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。这个不在django目录里面,在site-packages里面,是xadmin安装的时候带的,它会记录用户信息,也需要删除 5. 把xadmin.migrations目录下除了__init__.py以外的所有迁移文件,全部删除。 6. 删除我们当前数据库中的所有表 7. 接下来,执行数据迁移(makemigrations和migrate),回顾第0步中的数据,将数据导入就可以了,以后如果要修改用户相关数据,不需要重复本次操作,直接数据迁移即可。