前言

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架

希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex

1、什么是中间件

中间件属于AOP切面编程的衍生,SW-X中的中间件可以通过绑定路由地址,实现控制器无切入的关联绑定。

在中间件中,可以进行请求拦截(前置操作)、或者请求缓存销毁(后置操作)等业务。

2、通过路由绑定中间件

接回上章案例,我们现在要对/api/*前缀的所有接口,统一绑定一个名为Auth的中间件。

需要先再/config/middleware.php中间件配置文件中注册绑定规则:

  1. <?php
  2. return [
  3. // 匹配中间件,路由前半段是/api/开头的都会绑定到
  4. '/api/*' => [
  5. \box\middleware\Auth::class,
  6. ],
  7. ];

所有中间件不强制继承\x\Middleware基类,但一般建议继承,\x\Middleware类提供了一个error()方法,当开发者想中断应用继续向下执行时,可以调用该方法,抛出自定义的提示内容到客户端,该方法兼容了框架中4种不同的服务。

中间件建议(但不强制)统一存放在/box/middleware目录下, 便于项目管理。

接下来,我们在/box/middleware/目录下,创建一个Auth.php类,并写入代码:

  1. <?php
  2. /**
  3. * +----------------------------------------------------------------------
  4. * 权限中间件
  5. * +----------------------------------------------------------------------
  6. * 官网:https://www.sw-x.cn
  7. * +----------------------------------------------------------------------
  8. * 作者:小黄牛 <1731223728@qq.com>
  9. * +----------------------------------------------------------------------
  10. * 开源协议:http://www.apache.org/licenses/LICENSE-2.0
  11. * +----------------------------------------------------------------------
  12. */
  13. namespace box\middleware;
  14. use x\Middleware;
  15. use x\Restful;
  16. class Auth extends Middleware{
  17. // 需要跳过的路由
  18. private $_skip = [
  19. 'shop/delete',
  20. ];
  21. // 需要跳过的前置路由
  22. private $_group_skip = [
  23. 'login/',
  24. ];
  25. /**
  26. * 前置操作
  27. * @todo 无
  28. * @author 小黄牛
  29. * @version v2.5.0 + 2021.07.20
  30. * @deprecated 暂不启用
  31. * @global 无
  32. * @return void
  33. */
  34. public function handle() {
  35. // 获得当前路由地址
  36. $route = \x\Config::get('route');
  37. $url = str_replace($route['suffix'], '', ltrim(\x\Request::url(), $route['cutting']));
  38. $url = substr_replace($url, '', 0, (strpos($url, $route['cutting'])+1));
  39. // 跳过校验
  40. if (in_array($url, $this->_skip)) {
  41. return true;
  42. }
  43. // 跳过校验
  44. foreach ($this->_group_skip as $v) {
  45. if (stripos($url, $v) === 0) {
  46. return true;
  47. }
  48. }
  49. // 通过上下文,获得请求实例
  50. $Request = \x\context\Request::get();
  51. $get = $Request->get;// get表单
  52. $post = $Request->post;// post表单
  53. $header = $Request->header;// post表单
  54. // 没有访问权限
  55. if (!isset($get['test'])) {
  56. Restful::code(Restful::ACTION_ERROR())->callback();
  57. // 返回false表示中断执行
  58. return false;
  59. }
  60. // 返回true表示继续向下执行
  61. return true;
  62. }
  63. }

同时,由于上面我们使用了一个ACTION_ERROR状态码,所以要在Restful状态码文件中加入响应的配置。

/restful/default/code.php修改成如下代码:

  1. <?php
  2. return [
  3. 'ERROR' => 0, // 默认失败状态码
  4. 'SUCCESS' => 1, // 默认成功状态码
  5. 'ACTION_ERROR' => 40001, // 默认成功状态码
  6. ];

/restful/default/msg.php修改成如下代码:

  1. <?php
  2. return [
  3. // 默认错误状态码对应的tips
  4. 'ERROR' => [
  5. 'default' => '请求失败', // 默认值
  6. ],
  7. // 默认成功状态码对应的tips
  8. 'SUCCESS' => [
  9. 'default' => '请求成功', // 默认值
  10. 'test' => '测试msg',
  11. ],
  12. // 权限校验失败
  13. 'ACTION_ERROR' => [
  14. 'default' => '权限校验失败', // 默认值
  15. ],
  16. ];

这时候我们访问http://IP地址:端口/api/shop/select接口,就会看到框架抛出了下面的状态码:

  1. {
  2. "code": 40001,
  3. "msg": "权限校验失败",
  4. "data": []
  5. }

如果访问http://IP地址:端口/api/shop/select?test=就是通过的。

同时,我们还可以创建/app/http/v1_0_1/controller/shop/delete.php/app/http/v1_0_1/controller/login/send.php接口,来查看中间件判断是否能够正常跳过。

/app/http/v1_0_1/controller/shop/delete.php代码如下:

  1. <?php
  2. namespace app\http\v1_0_1\controller\shop;
  3. use x\controller\Http;
  4. // 引入Restful组件
  5. use x\Restful;
  6. class delete extends Http
  7. {
  8. public function index() {
  9. // Restful组件抛出接口响应
  10. return Restful::code(Restful::SUCCESS())->data([
  11. 'title' => '我是api/shop/delete,跳过了中间件校验',
  12. ])->callback();
  13. }
  14. }

/app/http/v1_0_1/controller/login/send.php代码如下:

  1. <?php
  2. namespace app\http\v1_0_1\controller\login;
  3. use x\controller\Http;
  4. // 引入Restful组件
  5. use x\Restful;
  6. class send extends Http
  7. {
  8. public function index() {
  9. // Restful组件抛出接口响应
  10. return Restful::code(Restful::SUCCESS())->data([
  11. 'title' => '我是api/login/send,跳过了中间件校验',
  12. ])->callback();
  13. }
  14. }

创建完成后,就可以通过下列地址查看测试效果了:

  1. http://IP地址:端口/api/shop/delete
  2. http://IP地址:端口/api/login/send

更多相关文章

  1. laravel_day5
  2. 20个常用正则表达式
  3. Android(安卓)Socket与HTTPS校验
  4. Android(安卓)Socket与HTTPS校验
  5. C# BIN文件读取以及CRC校验(匹配STM32F103)
  6. Django源代码-启动、接收、应用中间件链、路由匹配、完成请求
  7. SQL Server误区30日谈 第17天 有关页校验和的误区
  8. SQL Server简单模式下误删除堆表记录恢复方法(绕过页眉校验)
  9. android dm-verity 功能

随机推荐

  1. 下载频道2013年超人气精华资源汇总---全
  2. Android 应用开发笔记 - 图片视图(ImageVi
  3. 最易用的 Android HTTP library
  4. 如何向Android模拟器打电话发短信
  5. EditText 报出 “This text field does n
  6. 【android 其他】转载:Android 简史
  7. Android LCD(四):LCD驱动调试篇
  8. android的对话框
  9. Android:EditText 多行显示、属性汇总、族
  10. Android activity属性设置大全