目录
一、Django中User表的admin后台管理
- 继承UserAdmin去配置新的UserAdmin
- add_fieldsets:配置用户页面可控制字段
- list_display:配置用户列表展示页面显示的字段
- 注册自定义User表,定制化管理界面
# admin.py
from django.contrib import admin
from . import models
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
# 1. 继承UserAdmin去配置新的UserAdmin
class UserAdmin(AuthUserAdmin):
# 2. 添加用户页面可控制字段
add_fieldsets = (
(None, {
'classes': ('wide',),
# 自定义添加用户页面中的可控制字段,可以让密码变成密文
'fields': ('username', 'password1', 'password2', 'is_staff', 'mobile'),
}),
)
# 3. 自定义用户信息展示页面显示的字段
list_display = ('username', 'email', 'mobile', 'is_staff')
# 4. 注册自定义User表,用admin管理,配置UserAdmin,定制化管理页面
admin.site.register(models.User, UserAdmin)
# models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
mobile = models.CharField(max_length=11,verbose_name='电话号码')
class Meta:
da_table = 'new_user'
verbose_name_plural = '用户表'
def __str__(self ):
return self.username
# settings.py
AUTH_USER_MODEL = 'api.User'
二、Django中的权限管理(RBAC)
(一)RBAC
RBAC(Roal-Based Access Control ):基于角色的权限控制管理
传统的RBAC有两种:
权限三表:User、Group、Permission表
权限五表:User、Group、Permission、UserGroup、GroupPermission表
了解:基于Auth的权限管理认证模块的认证思想(THINKphp)
(二)权限六表
- Django中Auth组件采用的是权限六表(额外增加UP表):
- User、Group、Permission、UserGroup、GroupPermission、UserPermission表
- 注意:用户管理表一定要在第一次数据库迁移时完成
三、jwt认证规则
(一)什么是jwt
- jwt全称为JSON Web Token,是一个定义了一种紧凑的、自包含的方式,用于网络应用环境间传递声明而执行的一种基于JSON的开放标准,一种登陆认证的认证规则
- jwt由头、载荷和签名三部分组成,每一部分数据都是一个json字典,头和载荷采用 base64 可逆加密算法加密,签名采用 HS256 不可逆加密
(二)jwt认证中token的组成
token必须要有多个部分组成,包括可以反解和不可以反解,jwt采用的都是三段式
- 头(基本信息):包含采用的加密算法、公司名称、项目组、开发者等信息
- 载荷(核心信息):包含用户主键、用户账号、客户端设备信息、过期时间等信息
- 签名(安全信息):头的加密结果、载荷的加密结果、服务器的安全码(盐)等信息
(三)基于jwt的token认证集群(原理)
- 用户登录时,服务端根据账号密码通过签发加密算法生成token后,发送给浏览器
- 下次浏览器访问时,会携带着token,每台服务器上都存储着校验算法,再根据token解析出用户信息,从而判断用户状态
(四)优点
数据库压力小:客户端存储token,服务器只提供签发和校验算法的代码,数据库不需要存储token,所以服务器的IO操作会减少(没有IO写入操作,只有读取操作)
服务器集群便捷:签发与校验算法在多个服务器上可以直接复用,所以jwt验证规则下,服务器集群很便捷
(五)签发算法
- 头:内容写死(可以为空json字典),公司、项目组信息都是固定不变的
- 将数据字典转化成json字符串,再将json字符串加密成base64字符串
- 载荷:用户账号、客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验User表通过后才能确定,过期时间根据当前时间与配置的时间相结合产生
- 将数据字典转化成json字符串,再将json字符串加密成base64字符串
- 签名:先将头的机密结果、载荷的加密结果作为成员,再从服务器上拿安全码(不能让客户端知道),也可以额外包含载荷中的部分(用户信息、客户端设备信息)
- 将数据字典转化成json字符串,再将json字符串不可逆加密成hs256字符串
将三个字符串用.
连接产生三段式token
(六)校验算法
从客户端提交的请求中拿到token,用
.
分割成三段(如果不是三段,则为非法)头可以不用解密
载荷一定需要先base64解密成json字符串,再转化成json字典
用户主键与用户账号查询User表确定用户是否存在
设备信息与本次请求提交的设备信息比对,确定前后是否相同,从而判断是否对用户做安全提示(短信邮箱提示异地登录)(同样的安全验证还可以包括IP、登陆地点等)
过期时间与当前时间比对,该token是否在有效时间内
签名采用加密碰撞校验
将头、载荷加密字符串和数据库安全码形成的非json字段转换成json字符串
采用不可逆HS256加密形成字符串
新的加密字符串与第三段签名碰撞比对,一致才能确保token是合法的
前面算法都用过后,载荷校验得到的User对象,就是代表的登录用户(Django项目中,一般会把登录用户存放到request.user中)
(七)刷新算法
要在签发token的载荷中,额外添加两个时间信息,第一次签发的时间,可刷新的过期时间
每次请求携带token,不仅走校验算法验证token是否合法,还会额外请求刷新token的接口,完成token的刷新:校验规则和校验算法差不多,但是要将过期事件后移(没有超过有效时间,产生新token给客户端,如果超过了,刷新失败)