2011-11-29 65 views
29

我需要在登录检查后禁用重定向,因为我只需要获取登录是否成功。提交/ login_check url后,给我正确的数据,但保持重定向到/登录(失败)。
/之后登录为空。
我想使用extjs 4来设置登录表单,所以我需要验证通过ajax post请求。 login_check应该进行身份验证,创建用户会话并返回它是成功还是失败,但不在任何地方转发。如何在Symfony 2的login_check后禁用重定向

我login.html.twig样子:

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %} 
    { success:true } 
{% else %} 
    { success: false } 
{% endif %} 

和security.yml:

firewalls: 
    main: 
     form_login: 
      provider: fos_userbundle 
      failure_path: null 
      failure_forward: false 
+1

你能澄清你的使用情况,如刚关于如何适合您的应用程序的背景? – richsage

+0

我试图设置使用extjs 4登录。我得到的形式发送到symfony检查通过ajax后,但在检查GET请求appair登录页面,它可能会好,如果不会是空白的,所以js一直在等待获取可以处理的数据。 – user1063963

回答

60

创建身份验证处理程序:

namespace YourVendor\UserBundle\Handler; 

// "use" statements here 

class AuthenticationHandler 
implements AuthenticationSuccessHandlerInterface, 
      AuthenticationFailureHandlerInterface 
{ 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     if ($request->isXmlHttpRequest()) { 
      $result = array('success' => true); 
      return new Response(json_encode($result)); 
     } else { 
      // Handle non XmlHttp request here 
     } 
    } 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
    { 
     if ($request->isXmlHttpRequest()) { 
      $result = array('success' => false); 
      return new Response(json_encode($result)); 
     } else { 
      // Handle non XmlHttp request here 
     } 
    } 
} 

注册的处理程序的服务:

services: 
    authentication_handler: 
     class: YourVendor\UserBundle\Handler\AuthenticationHandler 

防火墙注册服务:

firewalls: 
    main: 
     form_login: 
      success_handler: authentication_handler 
      failure_handler: authentication_handler 

这是一个粗略的例子给你的总体思路 - 你需要自己找出细节。如果您遇到困难并需要进一步澄清,请在评论中提出您的问题,我会尽力详细说明该示例。

+0

success_handler和failure_handler选项可能是数组?如果我需要安装一些软件包并作为其配置的一部分,我需要注册bundle提供的success_handler和failure_handler。但他们已经注册了我自己的处理程序。如何注册多个处理程序? –

1

正常的symfony流程是将您重定向到一个登录页面,如果您没有登录,这对人类工作正常。但是你似乎在寻找一个程序化解决方案。

您是否尝试过在窗体中设置_target_path来声明“下一页”应该是什么? Symfony总是会在某个地方转发给你,但你可以将它设置在任何你想要的地方。

我发现这两个页面有用描述登录表单的内部运作: