第一步 先吧名字变成我想变得 这里有三处改动的地方。php
再次刷新后发现依然可使用,绝对溜溜的跑起来。在这一步中,也坚决了个人一些使用想法,好比创造多个中间件,每一个控制器都应该有一个相对应的,在这里执行一些本身象处理的,在看到手册上还可使用各类其余的方法,包括执行顺序的改变,这让我心中各类意淫。今后代码变得又能够稍微高大上一点了。json
第二步 创建功能规则 配合Config配置中的自建文件,对访问进行控制api
<?php
namespace apphttpmiddleware;
use thinkfacadeConfig;
use thinkfacadeRequest;
/**php框架
*/
class AdminLoginCheck
{安全
/** * handle 重写处理请求对象的操做函数 * @param object Request $request 请求对象 * @param object \Closure $next 响应对象 * @return array 错误返回的信息 * code 返回码 * msg 返回信息 * data 返回数据 * @return object 响应对象 */ public function handle($request, \Closure $next) { // 检测配置,查看该接口服务是否被暂停使用 if (true !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_api')) // 若是结果不符合要求则返回错误信息 exit(json_encode(['code'=>1,'msg'=>'Interface_Pause_service','data'=>''])); // 检测配置,是否执行请求验证类型 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_request')) { // 登录请求规则,传入相应方法,查看该接口是否符合请求类需 $res = self::loginRequestRole(Request::action()); // 若是结果不符合要求则返回错误信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Request_Type_Not_Matching','data'=>''])); } // 检测配置,是否执行地址限制验证 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address')) { // 客户端访问地址限制请求规则 $res = self::loginAddressDispose(Request::ip()); // 若是结果不符合要求则返回错误信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Address_Not_Access','data'=>''])); } // 格式化与处理前台参数 $request = self::loginParamDispose(Request::action(),$request); // 继续执行进入到控制器 return $next($request); } /** * loginRequestRole 请求类型验证 * @param string $scene 根据路径传入方法名称 * @return bool 验证用户访问的接口是否符合预设的请求要求 */ protected static function loginRequestRole($scene) { switch ($scene) { // 登录页面请求验证 case 'index': if (Request::isGet()) return true; else return false; break; // 登录接口请求验证 case 'login': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 登录接口请求验证 case 'resetPassword': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 默认验证或者不存在的场景返回 default: return false; break; } } /** * loginAddressDispose 地址是否容许访问 * @param string $address 须要传入一个address地址 * @return string 返回错误信息 * @return bool 检测正确返回真 */ protected static function loginAddressDispose($address) { // 读取配置内的设置参数 $data = Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address_data'); // 若是配置信息address列表为空则返回不能访问 if (empty($data)) return false; // 循环地址列表信息解开连续address地址列表 foreach ($data as $key => $val) { if ($val == $address) return true; } // 若是继续执行下去依然没有 返回不能访问 return false; } /** * loginParamDispose post内容与格式处理 * @param string $scene 须要前往的接口名称 * @param object $request 请求的对象内容 * @return object 返回处理过的请求对象 */ protected static function loginParamDispose($scene,$request) { switch ($scene) { // 登录页面 case 'index': break; // 登录接口请求参数处理 case 'login': // 前台用户传入的参数进行调整转换 $request->username = $request->param('user'); $request->password = $request->param('pass'); $request->captcha = $request->param('code'); // 对记住我进行处理 $remember = $request->param('remember'); if (null === $remember) $request->remember = 'shut'; else $request->remember = 'open'; break; // 重置密码接口参数处理 case 'resetPassword': // 前台用户传入的参数进行调整转换 $request->username = $request->param('user'); $request->phone = $request->param('mobile'); $request->phonecode = $request->param('code'); $request->password = $request->param('pass'); $request->repassword = $request->param('repass'); break; // 默认接口或者不存在的场景返回 default: break; } return $request; }
}app
第一个问题是 中间件并非万能的,只能作一些请求处理,并且是必须带参的,千万不要去作不符合要求的高级验证,这里最多的只是作一些前置验证,让数据安全或者让数据饱满框架
第二给问题是 不要在中间件中尝试作不合时宜的动做,不要在中间件中执行超级复杂的代码,若是你拿中间件作超级复杂的代码或者超长运算,我估计能够坑死不少人,这里所说包括了尽可能少使用本身函数库定义的函数代码验证 有些避不开的仍是可使用的,好比密码加密这种相似的代码函数