博客列表 >中间件学习

中间件学习

阿杰
阿杰原创
2023年04月12日 11:00:48443浏览

1、中间件是什么

  • 中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
  • 可以看成是 数据访问过程中的拦截器 。比如可以在控制器处理之前,先验证token是否过期,是否正确等

2、创建中间件

  • 安装中间件
  1. php think make:middleware CheckToken
  • 编写中间件(如token验证)
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\middleware;
  4. use app\warmtips\Result\Result; //统一返回处理
  5. class CheckToken
  6. {
  7. /**
  8. * 处理请求
  9. *
  10. * @param \think\Request $request
  11. * @param \Closure $next
  12. * @return Response
  13. */
  14. public function handle($request, \Closure $next)
  15. {
  16. //
  17. // var_dump('中间件CheckToken');
  18. // return $next($request);
  19. // 获取token
  20. $token = $request->param('token');
  21. // 验证token是否存在
  22. if(empty($token)){
  23. return Result::Error(0,'token不能为空');
  24. }else{
  25. $res = checkToken($token);
  26. if($res['code'] != 1){
  27. return Result::Error($res['code'],$res['msg']);
  28. }
  29. }
  30. return $next($request);
  31. }
  32. }

3、注册全局中间件

  • 在app下的middleware.php中注册
  1. return [
  2. // 注册中间件(验证token)
  3. \app\middleware\CheckToken::class
  4. ];
  • 访问任何一个控制器或者路由都会先执行这个中间件

4、注册应用中间件

  • 在app下某个应用如admin中的middleware.php中注册
  1. <?php
  2. // 这是系统自动生成的middleware定义文件
  3. return [
  4. \app\middleware\Test::class
  5. ];
  • 访问该应用的所有控制器都会先执行这个中间件

5、注册控制器中间件

  • 在某个控制器中如Api中单独注册
  1. protected $middleware = [\app\middleware\CheckToken::class => ['except' => ['login','index']]];
  • 访问该控制器的所有方法都会先执行这个中间件
  • except是跳过中间件,如上面的是login和index方法不用进行中间件验证

6、注册路由中间件

  • 在route下的app.php中注册
  1. Route::get('hello/:name', 'index/hello')->middleware(\app\middleware\CheckToken::class);
  • 访问该路由会先执行这个中间件

7、中间件所写的验证方法一般都是写在公共文件

  • app下的common.php文件
  1. /**
  2. * 生成token
  3. * $uid 输入用户openid&&id
  4. */
  5. if(!function_exists('signToken')){
  6. // 生成验签
  7. function signToken($uid)
  8. {
  9. $key = '!@#$%*&'; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当 于加密中常用的 盐 salt
  10. $token = array(
  11. "iss" => '', //签发者 可以为空
  12. "aud" => '', //面象的用户,可以为空
  13. "iat" => time(), //签发时间
  14. "nbf" => time(), //在什么时候jwt开始生效 (这里表示生成60秒后才生效)
  15. "exp" => time() + 120, //token 过期时间 (这里表示过期时间为120秒)
  16. 'data' => $uid //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
  17. );
  18. $jwt = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
  19. return $jwt;
  20. }
  21. }
  22. /**
  23. * 验证token
  24. * $token 生成的token值
  25. */
  26. if(!function_exists('checkToken')){
  27. // 验证token
  28. function checkToken($token)
  29. {
  30. $key = '!@#$%*&';
  31. $status = array("code"=>2);
  32. try {
  33. // JWT::$leeway = 60; //当前时间减去60,把时间留点余地
  34. JWT::$leeway = 0;
  35. $decode = JWT::decode($token,new Key($key,'HS256')); //HS256方式,这里要和签发的时候对应
  36. $arr = (array)$decode;
  37. $res['code'] = 1;
  38. $res['data'] = $arr['data'];
  39. return $res;
  40. } catch (SignatureInvalidException $e) { //签名不正确
  41. $status['msg'] = "签名不正确";
  42. return $status;
  43. } catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
  44. $status['msg'] = "token未生效";
  45. return $status;
  46. } catch (ExpiredException $e) { // token过期
  47. $status['msg'] = "token失效";
  48. return $status;
  49. } catch (Exception $e) { //其他错误
  50. $status['msg'] = "未知错误";
  51. return $status;
  52. }
  53. }
  54. }
  55. /**
  56. * 检验当前登录用户id,以便验证接口权限
  57. */
  58. if(!function_exists(uidGet)){
  59. function uidGet($token){
  60. $key = '!@#$%*&';
  61. JWT::$leeway = 0;
  62. $decode = JWT::decode($token,new Key($key,'HS256')); //HS256方式,这里要和签发的时候对应
  63. $arr = (array)$decode;
  64. return $arr['data'];
  65. }
  66. }

8、中间件的别名

  • 在config下的middleware.php文件中配置
  1. <?php
  2. // 中间件配置
  3. return [
  4. // 别名或分组 (对于经常要使用的中间件定义一个别名)
  5. 'alias' => [
  6. 'CheckToken' => \app\middleware\CheckToken::class,
  7. 'Auth' => \app\middleware\Auth::class
  8. ],
  9. // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
  10. 'priority' => [],
  11. ];
  • 控制器的中间件注册就可以化解为如下
  1. protected $middleware = ['CheckToken' => ['except' => ['login','index']]];
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
2023-07-04 12:00:251楼
很实用,学到了!