Symfony:如何将@Security批注与ajax请求一起使用

时间:2014-11-25 17:50:35

标签: php ajax symfony authentication redirect

我想将@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那样。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果我理解你在寻找什么,你应该能够创建一个自定义异常监听器,它在Symfony重定向用户之前根据内容类型标题和你喜欢的任何状态代码返回JSON响应。

http://symfony.com/doc/current/cookbook/service_container/event_listener.html