• 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. 所有服务器不仅要配置过期时间,还需要配置最长刷新时间
  • 相关阅读:
    UITableView
    xib的读取方式
    远程登录树莓派
    来体验下Linux吧
    树莓派了解Linux基本命令
    来感受Linux命令行的“真香定律”
    初尝树莓派
    从入手树莓派开始
    08-java学习笔记-集合框架中的工具类
    07-java学习笔记-map集合
  • 原文地址:https://www.cnblogs.com/2222bai/p/12126562.html
Copyright © 2020-2023  润新知