Я борюсь с промежуточным ПО авторизации в 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;
}
. SuperuserAuthorization выглядит следующим образом
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);
}
}