超薄PHP:仅使用中间件捕获有效路由
我正在用Slim编写一个REST API。我已经编写了一个小型中间件来保护资源,这样只有经过身份验证的用户才能访问它们:
<?php
class SecurityMiddleware extends SlimMiddleware
{
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
这样的路由,他将得到一个403,表示没有访问令牌,而不是HTTP状态代码404。我想在中间件类上添加一个类似以下检查的实现:
if ($app->hasRoute($app->request->getPathInfo()){
$this->next->call(); //let go so user gets 404 from the app.
}
有什么想法可以实现这一点吗?
解决方案
按照MamaWalter的建议,我使用hook来完成您想要做的事情,但是您希望使用slim.before.dispatch
而不是前面的钩子。如果您的用户尝试访问的路线不存在,则永远不会调用挂钩,并抛出404
。
我自己的Authorization Middleware就是这么做的。就像一种护身符。
相关文章