Slim 4 中的路由中间件不会停止调用路由中的可调用

我正在Slim4中处理授权中间件。这是我的代码:


$app = AppFactory::create();

$app->add(new Authentication());


$app->group('/providers', function(RouteCollectorProxy $group){

    $group->get('/', 'Project\Controller\ProviderController:get');

})->add(new SuperuserAuthorization());

身份验证中间件检查用户并正常工作。


提供程序控制器中的 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的新空响应,因此数据不会出来,但关键是请求永远不应该超出这个中间件,我是对的还是我只是误解了这里的东西......


慕沐林林
浏览 148回答 2
2回答

慕侠2389804

中间件的更新版本是: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 兼容中间件。在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/
打开App,查看更多内容
随时随地看视频慕课网APP