Request Handle 顾名思义 ,它的主要职责用来承载用户API请求,基于这个包将会衍生出框架的控制器基础类,也可以让当前类成为控制器基础类,控制器基础类将被每个实体业务控制器继承,所以它处在AK-FRAME层面.

所以在AK-FRAME层面,我们有request目录用来存储request相关的类实现文件,配置文件,相关工具包文件.

一. 工作流程组成部分

1.1 Request-Handle 模块设计图

Request-Handle 模块主要包括 请求合法性检测、请求数据体分析、权限校验等模块组成,相关具体的模块设计图如下所示:

二. 相关组件介绍

2.1 Request-Handle组件类

为了把Request模块统一打包对外服务,所以这里我们需要把Request-Handle组件抽象为一个RequestHandle类,这个类主要包含一些相关模块方法,可以被外部类引用,在请求校验阶段做出贡献。

2.2 请求合法性检测

对于网络请求来源复杂,我们首先不能让请求轻易进入消耗计算机资源的环节,所以这部分很关键,但是这部分具有很强的不确定性。因为随着计算机技术的发展,爬虫技术等模拟技术,黑客攻击的升级,这部分可能面临着修改的可能性,因此这部分除了进行基础的请求过滤外,还需要留下相关的扩展函数,便于后期进行调整。

请求合法性检测在实现层是RequestHandle类的一个函数,函数名为checkRequest,这个函数主要完成两部分工作。

  1. 路由放行:调用RequestHandle类子函数isRouteIgnore,这个部分主要检查当前请求的控制器和方法是不是在路由忽略列表,如果在列表内,则放过这个请求,这个应用场景主要针对一些权限初始化接口,比如用户登录、获取token 接口。

  2. 请求参数校验:调用RequestHandle类子函数checkHeader,这个部分主要对于header头部参数里的一些约定条件进行检测,目前主要包括的参数包括JWT令牌数据、请求来源from参数,这两个检测过程均为调用RequestHandle内部函数。

2.2.1 JWT组件包

JWT 是通用令牌协议,基于JWT可以做用户安全校验、同时开源社区提供了相关的代码包,可以帮助系统框架快速构建JWT令牌模块。

但是,在安装了JWT包后,我们不能直接使用开源社区的裸包,我们需要在AK-FRAME封装JWT子模块,子模块主要提供生成JWT和解析JWT的代码包,JWT封装层注意封装的用户单元信息不要采用uid,要采用用户名,便于后期做分布式系统,基于用户名的JWT,可以在各个系统之间可以做到统一登录。

校验JWT模块,这个是JWT包中的一个方法,名称为checkJWT,这个函数在RequestHandle类子函数checkHeader中被调用,主要对header头部传输进来的JWT数据做数据段的检验,包括JWT长度,和相关数据段拆分,如果JWT验证成功,则要把拆分后的数据体组成数组返回上一级,便于上一级函数把数据加载进控制器基础类相关属性。

2.2.2 请求参数匹配函数(filterRequestParames方法)

需要在 RequestHandle类中实现出请求参数匹配函数,这个是一个扩展单元,目前可以在函数内部仅仅做header部分的from参数判断,比如参数值可以为app,web,wechat,如果不在列表,则返回false,由上级接收到返回值后决定是否放行请求,在以后可能会对更多的请求参数进行过滤,这个函数将起到过滤效果。

2.3 请求数据体分析(getRequestData方法)

如果上面的流程已经顺利通过,那么这个请求在安全程度上已经是合法的了,那么将进行非常重要的两部分操作。

这个方法将调用ak-frame中的request目录下的requestData工具类,

  1. 请求数据体抽取:对于request 请求体的相关参数进行抽取,这部分是requestData工具类的实现,这个工具类基于TP5.1的request部分做了一层封装,提供一些基础方法,比如findGetDataByKey,findPostDataByKey等,这层封装既可以满足已经定制化请求数据,还可以降级对于TP框架的耦合度。

  2. 检查路由权限:这部分流程则需要检查当前请求所处的路由是够属于前面部分解析的JWT所对应的用户拥有的权限,首先会取出控制器基础类中的用户名,然后去缓存中查询是否有对应的用户权限,如果没有则调用权限包中的权限分析方法对于JWT解析出的用户名进行权限获取,如果已经存在则把缓存权限取出来,这两条线路最终都需要对于当前路由和用户权限列表中进行搜索,如果找到则放行,否则就拒绝访问。

文档更新时间: 2018-12-14 23:03   作者:李彪