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');
    }
}
相关推荐
涵信14 小时前
第八节:React HooksReact 18+新特性-React Server Components (RSC) 工作原理
前端·react.js·前端框架
程序猿John14 小时前
Mysql读写分离(2)-中间件mycat和实践方案
数据库·mysql·中间件
Nuyoah.15 小时前
《vue3学习手记3》
前端·javascript·vue.js·学习·前端框架
牛了爷爷18 小时前
php伪协议
android·开发语言·php
白露与泡影21 小时前
阿里一面:Nacos配置中心交互模型是 push 还是 pull ?(原理+源码分析)
开发语言·php·交互
brzhang21 小时前
Automa:chrome 插件神器,深入浏览器自动化的“积木”原理与实践
前端框架
vvilkim1 天前
React 入门完全指南:从零开始构建现代 Web 应用
前端·react.js·前端框架
vvilkim1 天前
React 入门教程:构建第一个 React 应用
前端·react.js·前端框架
ohMyGod_1231 天前
高阶函数/柯里化/纯函数
前端·react.js·前端框架
布兰妮甜1 天前
Angular 框架详解:从入门到进阶
前端·javascript·前端框架·angular.js