Tiny_Lu
不忘初心

Day 76 路由组件/RBAC/jwt认证规则

路由组件

在routers文件中加入自定义对应的接口路由(修改源码)

from django.conf.urls import url, include
from . import views
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('book', views.BookGenericViewSet, basename='book')

urlpatterns = [
    url(r'', include('router.urls'))
]

也可以自己创建一个router.py文件,将源码拷贝过来进行修改,添加自定义对应的接口路由,然后导入这个文件

mapping={
            'get': 'list',  # 群查
            'post': 'create',  # 单增、群增
            'put': 'multiple_update',  # 群整改
            'patch': 'multiple_partial_update',  # 群局改
            'delete': 'multiple_destroy',  # 群删
        }

注意: router.py文件中的Route, DynamicRoute必须从源文件中导入,否则会报错

from rest_framework.routers import Route, DynamicRoute, SimpleRouter as DRFSimpleRouter

RBAC角色权限设计方案

传统的RBAC: 权限三表--->权限五表

django的auth模块有六张表

用户表,分组表,权限表,用户分组表,分组权限表,用户权限表

jwt认证规则

优点:

  1. 数据库不需要存储token,所以服务器的IO操作会减少(没有IO写操作)
  2. 客户端存Token,服务器只存储签发和校验算法,执行效率高
  3. 签发和校验算法在多个服务器可以直接统一,所有jwt认证规则下,服务器做集群非常便捷

突破点:

  1. token必须要有多个部分组成,有能反解的部分,也要有不能反解的部分 - jwt采用的都是三段式
  2. token中必须包含过期时间,保证token的安全性和时效性

jwt原理:

  1. jwt由 头.载荷.签名 三部分组成
  2. 每一部分数据都是一个json字典,头和载荷采用 base64 可逆加密算法加密,签名采用 HS256 不可逆加密

内容:

  1. 头(基本信息): 可逆不可逆采用的加密算法,公司名称,项目组信息,项目组信息,开发者信息

    {
        "company": "",
        ...
    }
    
  2. 载荷(核心信息): 用户主键,用户账号,客户端设备信息,过期时间...

    {
    	"pk": 1,
        ...
    }
    
  3. 签名(安全信息): 头的加密结果,载荷的加密结果,服务器的安全码(salt)...

    {
        "header": "",
        ...
    }
    

签发算法:

  1. 头内容写死(可以为空字典)

    ​ => 将数据字典转成json字符串,再将json字符串加密成base64字符串

  2. 载荷的内容,用户账号,客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验User表通过后才能确定,过期时间根据当前时间与配置的过期时长相结合产生

    ​ => 将数据字典转成json字符串,再将json字符串加密成base64字符串

  3. 签名的内容,先将头的加密结果,载荷的加密结果作为成员,再从服务器上拿安全码(不能让任何客户端知道),也可以额外包含载荷中的部分(用户信息,客户端设备信息)

    ​ => 将数据字典转成json字符串,再将json字符串不可逆加密成HS256字符串

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

校验算法:

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

  2. 头(第一段)可以不用加密

  3. 载荷(第二段)一定需要解密,先base64解密成json字符串,再转换成json字典数据

    ​ 用户主键与用户账号确定用户是否存在

    ​ 设备信息用本次请求提交的设备信息比对,确定前后是否是同一设备,决定是否对用户做安全提示(eg: 短信邮箱提示异常登录),同样的安全保障还可以为IP,登录地点等

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

  4. 签名(第三段)采用加密碰撞校验

    ​ 同样将头,载荷加密字符串和数据库安全码形成json字典,转换成json字符串

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

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

刷新算法:

  1. 要在签发token的载荷中,额外添加两个时间信息: 第一次签发token的时间,最多往后刷新的过期时间
  2. 每次请求携带token,不仅走校验算法验证token是否合法,还要额外请求刷新token的接口,完成token的刷新: 校验规则与校验算法类似,但是要将过期时间后移(没有超过有效时间,产生新token给客户端,如果超过了,刷新失败)
  3. 所有服务器不仅要配置过期时间,还需要配置最长刷新时间
posted @ 2019-12-31 19:15  二二二二白、  阅读(142)  评论(0编辑  收藏  举报