我想将@Security注释用于应该由ajax请求调用的控制器操作。问题是,如果我使用" form_login"对于security.yml中的防火墙,该操作由未登录的用户调用,symfony拦截响应并向配置的登录页面发送302重定向。由于它是一个ajax请求,302重定向在这里没有意义。是否有(简单)方法来改变" form_login"的行为。不发送302重定向但是将401代码发送回客户端(ajax)?我可以找到很多关于如何覆盖AuthenticationSuccessHandler和AuthenticationFaliureHandler for $ request-> isXmlHttpRequest()的信息,如: http://www.webtipblog.com/adding-an-ajax-login-form-to-a-symfony-project/
但这只是其中的一部分,这样您就可以避免在用户提交表单时获得重定向。但我想做的是不仅在他已经尝试登录时向客户端发回401,而且还因为@Security注释或" access_control&#而不是将用户重定向到登录表单的URL。 34;配置。
我现在该怎么做:
class AjaxController extends Controller
{
/**
* @Route("/ajax/task/save")
*/
public function ajaxAction()
{
$user = $this->getUser();
if (!$user) {
// load login-form in JS code
return new JsonResponse(array('authenticated'=> false), 401);
}
// do...
}
}
但我想做的是:
class AjaxController extends Controller
{
/**
* @Route("/ajax/task/save")
* @Security("has_role('ROLE_USER')")
*/
public function ajaxAction()
{
// do...
}
}
但是这样我必须确保不会将重定向到登录表单的302发送到客户端,而是像上一个示例中的JsonResponse那样。
我该怎么做?
答案 0 :(得分:1)
如果我理解你在寻找什么,你应该能够创建一个自定义异常监听器,它在Symfony重定向用户之前根据内容类型标题和你喜欢的任何状态代码返回JSON响应。
http://symfony.com/doc/current/cookbook/service_container/event_listener.html