webman使用中间件验证指定的控制器及方法[青锐CC]
因为webman官方文档没有中间件验证指定的控制器的例子,写了一个小例子。
webman使用中间件验证指定的控制器及方法很简单,只需要三部:
1、新建一个中间件文件。
2、配置文件添加全局中间件。
3、指定的控制器中设置不需要验证的方法。
一、新建中间件文件
在"app\middleware"目录下新建文件"LoginCheck.php",主要内容是获取到请求的控制器类名和方法名,echo输出只是测试用,使用的时候注释或者删除,内容如下:
<?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
return [
'' => [
app\middleware\LoginCheck::class
]
];
三、指定的控制器中设置不验证的方法
中间件文件中指定验证的控制器为"app\controller\AdminController",它的文件是"app\controller"目录下的"AdminController.php"
如果想要验证所有的方法,不需要添加"noNeedCheckArr"
<?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');
}
}