超薄PHP:仅使用中间件捕获有效路由

2022-06-13 00:00:00 php slim

我正在用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就是这么做的。就像一种护身符。

相关文章