2013-03-25 156 views
3

對於我的Web服務使用FOSRestBundle,我創建了一個防火牆,強制登錄訪問應用程序。Symfony2防火牆和FOSRestBundle

我的問題是,當我通過ajax調用API時,我需要得到錯誤代碼401,當用戶沒有通過身份驗證,而不是接收登錄表單的html源代碼。我如何配置應用程序?

secured_area: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       use_forward: false 
       default_target_path: /w 
      logout: 
       path: /logout 
       target: /login 

編輯:

感謝瑞安這裏是KernelExceptionListener方法。

public function onKernelException(GetResponseForExceptionEvent $event) { 
    // get exception 
    $exception = $event->getException(); 
    // get path 
    $path = $event->getRequest()->getPathInfo(); 

    if ($exception instanceOf AuthenticationException && ($event->getRequest()->isXmlHttpRequest() || strpos($path, '/api') === 0)) { 
     $response = new Response(); 
     $response->setStatusCode(401); 
     $event->setResponse($response); 
     $event->stopPropagation(); 
    } 
} 
+1

很高興你的工作。我在FOSRestBundle#411上創建了一個新問題,希望能夠將此功能作爲該包的一部分提供。 https://github.com/FriendsOfSymfony/FOSRestBundle/issues/411 – Ryan 2013-03-26 22:02:07

回答

2

您使用了驗證字而不是授權字,不幸的是,這似乎沒有寫入。因此,您可能需要創建自己的。

在一般情況下,應該創建一個簡單的Kernel Event listener來攔截AuthenticationException異常。捕獲此事件應允許您在重定向到登錄頁面之前執行任何您喜歡的操作。

FOSRestBundle應該提供一個很好的例子來說明如何做到這一點。 FOSRestBundle目前爲授權層提供此功能(AccessDeniedException)。通過一點點的修改,同一個框架也應該爲身份驗證層提供相同的功能。

請參閱拉#308以獲得提供授權偵聽器的更改集。 有關如何配置偵聽器的文檔,請參閱Security Exception Listener