Blogger Information
Blog 87
fans 1
comment 0
visits 59136
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
中间件学习
阿杰
Original
448 people have browsed it

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']]];
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
1 comments
2023-07-04 12:00:25
很实用,学到了!
1 floor
Author's latest blog post