我在 Slim4 中的授权中间件上遇到了困难。这是我的代码:
$app = AppFactory::create();
$app->add(new Authentication());
$app->group('/providers', function(RouteCollectorProxy $group){
$group->get('/', 'Project\Controller\ProviderController:get');
})->add(new SuperuserAuthorization());
身份验证中间件检查用户并且工作正常。
方法get在 ProviderController 中是
public function get(Request $request, Response $response): Response{
$payload = [];
foreach(Provider::all() as $provider){
$payload[] = [
'id' => $provider->id,
'name' => $provider->name,
];
}
$response->getBody()->write(json_encode($payload));
return $response;
}
超级用户授权看起来像这样
class SuperuserAuthorization{
public function __invoke(Request $request, RequestHandler $handler): Response{
$response = $handler->handle($request);
$authorization = explode(" ", $request->getHeader('Authorization')[0]);
$user = User::getUserByApiKey($authorization[1]);
if(! Role::isSuperuser($user)){
return $response->withStatus(403);//Forbidden
}
return $response;
}
}
问题是,即使用户不是超级用户,应用程序也会继续执行。结果我得到了所有提供者的 json 和 http 代码 403 :/
路由中间件不应该阻止请求进入应用程序并立即返回 403 吗?
我知道我可以创建状态为 403 的新空响应,因此数据不会出来,但重点是请求永远不应该超出这个中间件,我是对的还是我只是误解了这里的某些内容......
任何帮助将不胜感激 :)
- - - - - - - 解决方案 - - - - - - - -
感谢@Nima 我解决了它。中间件更新版本为:
class SuperuserAuthorization{
public function __invoke(Request $request, RequestHandler $handler): Response{
$authorization = explode(" ", $request->getHeader('Authorization')[0]);
$user = User::getUserByApiKey($authorization[1]);
if(! Role::isSuperuser($user)){
$response = new Response();
return $response->withStatus(403);//Forbidden
}
return $handler->handle($request);
}
}