Я пишу REST API с помощью Slim. Я написал небольшое промежуточное ПО для защиты ресурсов, чтобы только прошедшие аутентификацию пользователи могли получить к ним доступ:
<?php
class SecurityMiddleware extends \Slim\Middleware
{
protected $resource;
public function __construct($resource)
{
$this->resource = $resource;
}
public function call()
{
//get a reference to application
$app = $this->app;
//skip routes that are exceptionally allowed without an access token:
$publicRoutes = ["/","/login","/about"];
if (in_array($app->request()->getPathInfo(),publicRoutes)){
$this->next->call(); //let go
} else {
//Validate:
if ($this->resource->isValid()){
$this->next->call(); //validation passed, let go
} else {
$app->response->setStatus('403'); //validation failed
$app->response->body(json_encode(array("Error"=>"Access token problem")));
return;
}
}
}
}
Это работает, но нежелательным побочным эффектом является то, что промежуточное ПО не делает различий между существующими маршрутами и несуществующими маршрутами. Например, если пользователь пытается запросить несуществующий маршрут типа /dfghdfgh
, вместо получения кода состояния HTTP 404 он получит 403, в котором говорится, что токена доступа нет. Я хотел бы добавить реализацию, аналогичную следующей проверке класса промежуточного программного обеспечения:
if ($app->hasRoute($app->request->getPathInfo()){
$this->next->call(); //let go so user gets 404 from the app.
}
Есть идеи, как этого можно достичь?