2 回答
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);
}
}
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/
- 2 回答
- 0 关注
- 147 浏览
添加回答
举报