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中的方法,结果却意外发现,先执行一遍控制器中的方法,然后再执行的中间件中的方法。
这不是期待的结果,虽然查询类的接口可以改造返回值,但是如果是执行类的接口,那岂不是在拦截时就已经执行了。
不知道是我在哪里写错了吗?
就在我发了提问之后,忽然想到了答案:
在中间件中把$response = $handler($request)一行删掉,在最后和白名单里都写成return $handler($request),然后就没有问题了,所以我想,当程序执行到$response = $handler($request)这句时,对应被请求的控制器代码就已经被执行了。
你这样想是对的
默认路由关了就行吧。