虽然webman中间件生效了,但是controller中的方法还是执行了

cqqjj1029
class UserAuthCheck implements MiddlewareInterface
{
    protected $controllerScope = [
        'app\controller\calltask',
    ];

    protected $actionWhiteList = [

    ];

    public function process(Request $request, callable $handler): Response
    {
        $controller = strtolower($request->controller);
        $action = strtolower($request->action);
        $path = "{$controller}/{$action}";  // 完整的控制器/方法字符串
        $response = $handler($request); // 正常情况下继续响应后续请求
        // 白名单方法的请求不拦截
        if (in_array($path, $this->actionWhiteList)) {
            return $response;
        }
        // 只拦截指定控制器的请求
        if (in_array($controller, $this->controllerScope)) {
            $res = \app\bootstrap\ReturnCode::$entity->setCode(RETURNCODE_NOT_LOGED);
            $token = $request->header('Authorization');
            if (!$token) {
                var_dump('token不存在');
                return json($res);
            }
            $tokenKey = rediskey_user_token($token);
            $tokenData = \support\Redis::hGetAll($tokenKey);
            if (!$tokenData || empty($tokenData)) {
                var_dump('token内容无效');
                return json($res);
            }
        }
        var_dump('继续后续操作');
        return $response;
    }
}

中间件文件:app\middleware\UserAuthCheck.php

在控制器CallTask.php中试着做一个status方法:

public function status(Request $request)
    {
        var_dump('执行到这里了');
        $taskId = $request->input('task_id');
        $callTaskService = new \app\service\CallTask();
        $res = $callTaskService->status($taskId);
        return json($res);
    }

在config\middleware.php中也做了对应了配置,试着不在header中传Authorization请求一个calltask中的方法,结果却意外发现,先执行一遍控制器中的方法,然后再执行的中间件中的方法。

截图

这不是期待的结果,虽然查询类的接口可以改造返回值,但是如果是执行类的接口,那岂不是在拦截时就已经执行了。

不知道是我在哪里写错了吗?

903 2 0
2个回答

cqqjj1029

就在我发了提问之后,忽然想到了答案:
在中间件中把$response = $handler($request)一行删掉,在最后和白名单里都写成return $handler($request),然后就没有问题了,所以我想,当程序执行到$response = $handler($request)这句时,对应被请求的控制器代码就已经被执行了。

ersic

默认路由关了就行吧。

如果你想关闭默认路由,在配置文件 config/route.php里最后一行加上如下配置:

Route::disableDefaultRoute();
  • 暂无评论
年代过于久远,无法发表回答
🔝