FOSRestBundle не перехватывает исключения

Я пытаюсь настроить FOSRestBundle для перехвата исключений аутентификации. Моя конфигурация:

fos_rest:
  param_fetcher_listener: true
  body_listener: true
  format_listener: true
  view:
    default_engine: php
  format_listener:
    default_priorities: ['json']
    fallback_format: json
    prefer_extension: false
  access_denied_listener:
    json: true
  exception:
    codes:
      Symfony\Component\Security\Core\Exception\AccessDeniedException: 403

twig:
  exception_controller: FOS\RestBundle\Controller\ExceptionController::showAction

Эта конфигурация будет перехватывать исключения, когда они возникают в контроллере, но не когда они возникают из компонента безопасности (т. е. в случае сбоя аутентификации пользователя). Что-то не так с моей конфигурацией, или FOSRestBundle просто не предназначен для перехвата исключений в этой точке стека?

Стоит отметить, что я использую собственный провайдер аутентификации, основанный на туториале WSSE:

http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html


person Mathew    schedule 04.07.2013    source источник
comment
Здравствуйте, у меня такая же проблема, вы нашли решение?   -  person Jukurrpa    schedule 27.11.2014
comment
Извини, нет. В итоге мы использовали совершенно другой метод аутентификации!   -  person Mathew    schedule 28.11.2014


Ответы (2)


исключения аутентификации обычно должны обрабатываться службой обработчика ошибок аутентификации.

Обработчики аутентификации можно найти в файле security.yml:

security:
    firewalls:
       firewall_name:
           form_login:
               # ...
               failure_path:    /foo
               failure_forward: false
               failure_path_parameter: _failure_path
               failure_handler: some.service.id
               success_handler: some.service.id

см. справочник по настройке.

Информацию о том, как реализовать собственный обработчик ошибок.

person Nicolai Fröhlich    schedule 04.07.2013
comment
Спасибо, но я должен был упомянуть; Я использую пользовательского поставщика аутентификации, а не стандартную форму входа в систему. - person Mathew; 04.07.2013

У меня была точно такая же проблема. Моя проблема заключалась в том, что WsseListener на самом деле не выдавал исключение. Их учебник имеет этот код:

try {
            $authToken = $this->authenticationManager->authenticate($token);
            $this->securityContext->setToken($authToken);

        return;
    } catch (AuthenticationException $failed) {
        // ... you might log something here

        // To deny the authentication clear the token. This will redirect to the login page.
        // Make sure to only clear your token, not those of other authentication listeners.
        // $token = $this->securityContext->getToken();
        // if ($token instanceof WsseUserToken && $this->providerKey === $token->getProviderKey()) {
        //     $this->securityContext->setToken(null);
        // }
        // return;

        // Deny authentication with a '403 Forbidden' HTTP response
        $response = new Response();
        $response->setStatusCode(403);
        $event->setResponse($response);

    }

    // By default deny authorization
    $response = new Response();
    $response->setStatusCode(403);
    $event->setResponse($response);
}

Обратите внимание, как AuthenticationException перехватывается, а затем возвращает HTTP-ответ.

Я исправил свой, просто набрав $failed:

catch (AuthenticationException $failed) {
     throw $failed
} 
person flivan    schedule 02.10.2013