我正在使用OAuth2服务器捆绑包,我想为控制器中的所有方法对用户进行身份验证。它与文档How to Setup before and after Filters中的用例非常相似,只是我想返回响应,而不是抛出异常。
onKernelController
和FilterControllerEvent
使我可以访问控制器,因此我可以访问OAuth2服务器捆绑包的响应方法。但我无法在那里回复任何回复。我可以使用GetResponseEvent
在onKernelController
中返回响应,但它在onKernelController
之前被调用。
我也研究了kernel.exception
,但getResponse()
返回了不同的错误消息,所以我不只是抛出一个不明确的异常。
对于我正在努力实现的目标,最佳实践是什么?
这是我的代码:
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if ($controller[0] instanceof 'Foo'Bundle'AuthBundle'Controller'TokenAuthenticatedController) {
$server = $controller[0]->get('oauth2.server');
$request = $controller[0]->get('oauth2.request');
$response = $controller[0]->get('oauth2.response');
if (!$server->verifyResourceRequest($request, $response)) {
return $server->getResponse();
}
}
}
public function onKernelRequest(GetResponseEvent $event)
{
$event->setResponse(new Response('Some response', 501));
}
在EventListener方法中,您不能返回响应,但必须在事件本身上设置它。
问题是事件FilterControllerEvent
无法管理返回的响应,因此更好的方法是管理(侦听)GetResponseForControllerResultEvent,您可以在其中设置响应并停止传播。
希望得到帮助。