Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slim 4&x27中的路由中间件;t停止调用路由中的可调用项_Php_Routes_Middleware_Slim 4 - Fatal编程技术网

Php Slim 4&x27中的路由中间件;t停止调用路由中的可调用项

Php Slim 4&x27中的路由中间件;t停止调用路由中的可调用项,php,routes,middleware,slim-4,Php,Routes,Middleware,Slim 4,我正在Slim4中使用授权中间件。这是我的密码: $app = AppFactory::create(); $app->add(new Authentication()); $app->group('/providers', function(RouteCollectorProxy $group){ $group->get('/', 'Project\Controller\ProviderController:get'); })->add(new Superus

我正在Slim4中使用授权中间件。这是我的密码:

$app = AppFactory::create();
$app->add(new Authentication());

$app->group('/providers', function(RouteCollectorProxy $group){
    $group->get('/', 'Project\Controller\ProviderController:get');
})->add(new SuperuserAuthorization());
身份验证中间件检查用户并正常工作

ProviderController中的方法get

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);
    }
}
路由中间件不应该阻止请求进入应用程序并立即返回403吗

Slim 4使用兼容的中间件。如何在PSR-15元文档中实现一个授权中间件有很多好处。如果不希望进一步处理请求,则需要避免调用
$handler->handle($request)

正如您在示例中看到的,如果请求未经授权,则返回与
$handler->handle($request)
的返回值不同的响应。这意味着你的观点是:

我知道我可以创建状态为403的新空响应,所以数据不会出来,但关键是请求永远不应该超出这个中间件

在某种程度上是正确的,但是您应该在调用处理程序之前返回适当的响应,或者抛出异常并让错误处理程序处理它,从而防止请求进一步进行

下面是一个简单的中间件,它随机授权一些请求,并为其他请求抛出异常:

$app->group('/protected', function($group){
    $group->get('/', function($request, $response){
        $response->getBody()->write('Some protected response...');
        return $response;
    });
})->add(function($request, $handler){
    // randomly authorize/reject requests
    if(rand() % 2) {
        // Instead of throwing an exception, you can return an appropriate response
        throw new \Slim\Exception\HttpForbiddenException($request);
    }
    $response = $handler->handle($request);
    $response->getBody()->write('(this request was authorized by the middleware)');
    return $response;
});

要查看不同的响应,请访问几次
/protected/
路径(请记住中间件的行为是随机的)

谢谢@Nima。我要是早点问这个问题就好了。我现在更新了我的中间件,它按预期工作。干杯:)很乐意帮忙:)