为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕沐林林 2022-08-05 09:35:21
我正在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的新空响应,因此数据不会出来,但关键是请求永远不应该超出这个中间件,我是对的还是我只是误解了这里的东西......
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

中间件的更新版本是:


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);

    }

}


查看完整回答
反对 回复 2022-08-05
?
富国沪深

TA贡献1790条经验 获得超9个赞

路由中间件难道不应该阻止请求进入应用程序并立即返回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/


查看完整回答
反对 回复 2022-08-05
  • 2 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信