webman使用中间件验证指定的控制器及方法[青锐CC]

因为webman官方文档没有中间件验证指定的控制器的例子,写了一个小例子。

webman使用中间件验证指定的控制器及方法很简单,只需要三部:

1、新建一个中间件文件。

2、配置文件添加全局中间件。

3、指定的控制器中设置不需要验证的方法。

一、新建中间件文件

在"app\middleware"目录下新建文件"LoginCheck.php",主要内容是获取到请求的控制器类名和方法名,echo输出只是测试用,使用的时候注释或者删除,内容如下:

php 复制代码
<?php
#验证登录
namespace app\middleware;

use ReflectionClass;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

class LoginCheck implements MiddlewareInterface
{
    public function process(Request $request, callable $handler): Response
    {
        $controller = $request->controller; //控制器类名
        $action = $request->action;         //控制器方法
        echo "控制器:".$controller."\n";
        echo "方法:".$action."\n";
        if(in_array($controller,["app\controller\AdminController"])){  //在数组中添加需要验证的控制器类名
            echo "控制器需要验证\n";
            $reflection = new ReflectionClass($controller);             //创建控制器类的反射
            $noNeedCheckArr = $reflection->getDefaultProperties()['noNeedCheckArr'] ?? [];     //获得控制器类中的noNeedCheck方法,如果不存在设置为空数组
            if (!in_array($action, $noNeedCheckArr)) {  //需要检查
                echo "方法需要验证\n";
                $admin = session('admin',"");   //如果名为admin的sessin不存在则赋值为""
                if ($admin!="") {  //如果不等于空字符串说明已经登录,请求继续向洋葱芯穿越
                    echo "已登录,继续\n";
                    return $handler($request);
                }else{  //为空字符串说明没登录
                    echo "未登录,重定向登录页\n";
                    return redirect('/admin/login');
                }
            }else{  //此方法不需要验证,请求继续向洋葱芯穿越
                echo "方法不需要验证\n";
                return $handler($request);
            }
        }else{  //控制器不需要验证,请求继续向洋葱芯穿越
            echo "控制器不需要验证\n";
            return $handler($request);
        }
    }
}

二、配置文件添加全局中间件

配置文件为"config/middleware.php",添加后内容如下:

php 复制代码
<?php

return [
	'' => [
        app\middleware\LoginCheck::class
    ]
];

三、指定的控制器中设置不验证的方法

中间件文件中指定验证的控制器为"app\controller\AdminController",它的文件是"app\controller"目录下的"AdminController.php"

如果想要验证所有的方法,不需要添加"noNeedCheckArr"

php 复制代码
<?php

namespace app\controller;

use support\Request;
use support\Response;
use support\View;

class AdminController
{
    protected $noNeedCheckArr = ['login','captcha'];    //登录、验证码的方法不需要验证

    public function index(Request $request)
    {
        View::assign([
            'name1' => 'value1',
            'name2'=> 'value2',
        ]);
        return view('admin/index');
    }
    public function login(Request $request){
        return view('admin/login');
    }
}
相关推荐
MySGDLife11 分钟前
中间件八股
中间件
薛定谔的算法3 小时前
《虚拟 DOM 与 Diff 算法:用 1500 字把它讲成“人话”》
前端·react.js·前端框架
爱隐身的官人3 小时前
ctfshow - web - 命令执行漏洞总结(二)
php·命令执行
EndingCoder4 小时前
Electron 跨平台兼容性:处理 OS 差异
前端·javascript·electron·前端框架·node.js·chrome devtools
知识分享小能手5 小时前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
Mr_hwt_1236 小时前
基于MyCat 中间件实现mysql集群读写分离与从库负载均衡教程(详细案例教程)
数据库·mysql·中间件·mysql集群
小菜全14 小时前
基于若依框架Vue+TS导出PDF文件的方法
javascript·vue.js·前端框架·json
资深前端之路15 小时前
react 面试题 react 有什么特点?
前端·react.js·面试·前端框架
悠悠~飘18 小时前
php简介(第一天打卡)
php
阳光阴郁大boy19 小时前
大学信息查询平台:一个现代化的React教育项目
前端·react.js·前端框架