2011-11-29 66 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總是會在某個地方轉發給你,但你可以將它設置在任何你想要的地方。

我發現這兩個頁面有用描述登錄表單的內部運作: