(day76)AbstractUser表admin后台管理、RBAC(权限六表)、jwt认证规则

一、Django中User表的admin后台管理

  1. 继承UserAdmin去配置新的UserAdmin
  2. add_fieldsets:配置用户页面可控制字段
  3. list_display:配置用户列表展示页面显示的字段
  4. 注册自定义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

  1. RBAC(Roal-Based Access Control ):基于角色的权限控制管理

  2. 传统的RBAC有两种:

    • 权限三表:User、Group、Permission表

    • 权限五表:User、Group、Permission、UserGroup、GroupPermission表

  3. 了解:基于Auth的权限管理认证模块的认证思想(THINKphp)

(二)权限六表

  1. Django中Auth组件采用的是权限六表(额外增加UP表):
    • User、Group、Permission、UserGroup、GroupPermission、UserPermission表
  2. 注意:用户管理表一定要在第一次数据库迁移时完成

三、jwt认证规则

(一)什么是jwt

  1. jwt全称为JSON Web Token,是一个定义了一种紧凑的、自包含的方式,用于网络应用环境间传递声明而执行的一种基于JSON的开放标准,一种登陆认证的认证规则
  2. jwt由头、载荷和签名三部分组成,每一部分数据都是一个json字典,头和载荷采用 base64 可逆加密算法加密,签名采用 HS256 不可逆加密

(二)jwt认证中token的组成

token必须要有多个部分组成,包括可以反解和不可以反解,jwt采用的都是三段式

  1. 头(基本信息):包含采用的加密算法、公司名称、项目组、开发者等信息
  2. 载荷(核心信息):包含用户主键、用户账号、客户端设备信息、过期时间等信息
  3. 签名(安全信息):头的加密结果、载荷的加密结果、服务器的安全码(盐)等信息

(三)基于jwt的token认证集群(原理)

  1. 用户登录时,服务端根据账号密码通过签发加密算法生成token后,发送给浏览器
  2. 下次浏览器访问时,会携带着token,每台服务器上都存储着校验算法,再根据token解析出用户信息,从而判断用户状态

(四)优点

  1. 数据库压力小:客户端存储token,服务器只提供签发和校验算法的代码,数据库不需要存储token,所以服务器的IO操作会减少(没有IO写入操作,只有读取操作)

  2. 服务器集群便捷:签发与校验算法在多个服务器上可以直接复用,所以jwt验证规则下,服务器集群很便捷

(五)签发算法

  1. 头:内容写死(可以为空json字典),公司、项目组信息都是固定不变的
    • 将数据字典转化成json字符串,再将json字符串加密成base64字符串
  2. 载荷:用户账号、客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验User表通过后才能确定,过期时间根据当前时间与配置的时间相结合产生
    • 将数据字典转化成json字符串,再将json字符串加密成base64字符串
  3. 签名:先将头的机密结果、载荷的加密结果作为成员,再从服务器上拿安全码(不能让客户端知道),也可以额外包含载荷中的部分(用户信息、客户端设备信息)
    • 将数据字典转化成json字符串,再将json字符串不可逆加密成hs256字符串

将三个字符串用.连接产生三段式token

(六)校验算法

  1. 从客户端提交的请求中拿到token,用.分割成三段(如果不是三段,则为非法)

  2. 头可以不用解密

  3. 载荷一定需要先base64解密成json字符串,再转化成json字典

    • 用户主键与用户账号查询User表确定用户是否存在

    • 设备信息与本次请求提交的设备信息比对,确定前后是否相同,从而判断是否对用户做安全提示(短信邮箱提示异地登录)(同样的安全验证还可以包括IP、登陆地点等)

    • 过期时间与当前时间比对,该token是否在有效时间内

  4. 签名采用加密碰撞校验

    • 将头、载荷加密字符串和数据库安全码形成的非json字段转换成json字符串

    • 采用不可逆HS256加密形成字符串

    • 新的加密字符串与第三段签名碰撞比对,一致才能确保token是合法的

  5. 前面算法都用过后,载荷校验得到的User对象,就是代表的登录用户(Django项目中,一般会把登录用户存放到request.user中)

(七)刷新算法

  1. 要在签发token的载荷中,额外添加两个时间信息,第一次签发的时间,可刷新的过期时间

  2. 每次请求携带token,不仅走校验算法验证token是否合法,还会额外请求刷新token的接口,完成token的刷新:校验规则和校验算法差不多,但是要将过期事件后移(没有超过有效时间,产生新token给客户端,如果超过了,刷新失败)

猜你喜欢

转载自www.cnblogs.com/wick2019/p/12130854.html