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认证规则
优点:
- 数据库不需要存储token,所以服务器的IO操作会减少(没有IO写操作)
- 客户端存Token,服务器只存储签发和校验算法,执行效率高
- 签发和校验算法在多个服务器可以直接统一,所有jwt认证规则下,服务器做集群非常便捷
突破点:
- token必须要有多个部分组成,有能反解的部分,也要有不能反解的部分 - jwt采用的都是三段式
- token中必须包含过期时间,保证token的安全性和时效性
jwt原理:
- jwt由 头.载荷.签名 三部分组成
- 每一部分数据都是一个json字典,头和载荷采用 base64 可逆加密算法加密,签名采用 HS256 不可逆加密
内容:
-
头(基本信息): 可逆不可逆采用的加密算法,公司名称,项目组信息,项目组信息,开发者信息
{ "company": "", ... }
-
载荷(核心信息): 用户主键,用户账号,客户端设备信息,过期时间...
{ "pk": 1, ... }
-
签名(安全信息): 头的加密结果,载荷的加密结果,服务器的安全码(salt)...
{ "header": "", ... }
签发算法:
-
头内容写死(可以为空字典)
=> 将数据字典转成json字符串,再将json字符串加密成base64字符串
-
载荷的内容,用户账号,客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验User表通过后才能确定,过期时间根据当前时间与配置的过期时长相结合产生
=> 将数据字典转成json字符串,再将json字符串加密成base64字符串
-
签名的内容,先将头的加密结果,载荷的加密结果作为成员,再从服务器上拿安全码(不能让任何客户端知道),也可以额外包含载荷中的部分(用户信息,客户端设备信息)
=> 将数据字典转成json字符串,再将json字符串不可逆加密成HS256字符串
-
将三个字符串用 . 连接产生三段式token
校验算法:
-
从客户端提交的请求中拿到token,用 . 分割成三段(如果不是三段,非法)
-
头(第一段)可以不用加密
-
载荷(第二段)一定需要解密,先base64解密成json字符串,再转换成json字典数据
用户主键与用户账号确定用户是否存在
设备信息用本次请求提交的设备信息比对,确定前后是否是同一设备,决定是否对用户做安全提示(eg: 短信邮箱提示异常登录),同样的安全保障还可以为IP,登录地点等
过期时间与当前时间比对,该token是否在有效时间内
-
签名(第三段)采用加密碰撞校验
同样将头,载荷加密字符串和数据库安全码形成json字典,转换成json字符串
采用不可逆HS256加密形成加密字符串
新的加密字符串与第三段签名碰撞比对,一致才能确保token是合法的
刷新算法:
- 要在签发token的载荷中,额外添加两个时间信息: 第一次签发token的时间,最多往后刷新的过期时间
- 每次请求携带token,不仅走校验算法验证token是否合法,还要额外请求刷新token的接口,完成token的刷新: 校验规则与校验算法类似,但是要将过期时间后移(没有超过有效时间,产生新token给客户端,如果超过了,刷新失败)
- 所有服务器不仅要配置过期时间,还需要配置最长刷新时间