2013-03-25 3 views
3

Для моего веб-сервиса с использованием FOSRestBundle я создал брандмауэр, который заставляет логин получать доступ к приложению.Брандмауэр Symfony2 и FOSRestBundle

Моя проблема заключается в том, что когда я звоню в API через ajax, мне нужно получить код ошибки 401, когда пользователь не аутентифицирован, а не получает исходный код html формы входа. Как настроить приложение?

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

EDIT:

Благодаря Райан здесь метод 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

ответ

2

Вы использовали слово аутентификация, а не авторизацию, и, к сожалению, это, похоже, уже не написано. Поэтому вам, вероятно, нужно будет создать свой собственный.

В общем случае необходимо создать простой Kernel Event listener для перехвата исключения AuthenticationException. Захват этого события должен позволить вам выполнить любое действие, которое вам нравится, до перенаправления на страницу входа.

FOSRestBundle должен служить хорошим примером того, как это сделать. FOSRestBundle предоставляет эту функциональность для уровня авторизации в настоящее время (AccessDeniedException). С небольшим изменением одна и та же структура должна обеспечивать возможность сделать то же самое и для уровня аутентификации.

См. Pull #308 для набора изменений, предоставляющего слушателям авторизации. См. Security Exception Listener для документации о настройке слушателей.

Смежные вопросы