Установите flashmessage из AuthenticationHandler в Symfony2


У меня проблема с FOSUserBundle, так как каждый раз, когда я вхожу в систему с неверными учетными данными, я получаю полную трассировку стека в виде сообщения об ошибке:

Ошибка! исключение 'Symfony\Компонент\Безопасность\Ядро\Исключение\Исключение BadCredentialsException' с сообщением "Неверные учетные данные" в /var/www/html/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php:90

И это некрасиво для меня, поэтому для пользователей это очень некрасиво. Так Я думаю о двух решениях: изменить логин AJAX, над которым я работаю, но он не работает, или я делаю что-то неправильно (объясню ниже), и нашел способ изменить это уродливое сообщение (я еще не получил это, поэтому любой совет будет полезен).

Теперь, что касается первого решения, вот что я сделал:

  • Реализует AuthenticationHandler:

    <?php
    
    namespace UsuarioBundle\Handler;
    
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Bundle\FrameworkBundle\Routing\Router;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
    use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    
    class AuthenticationHandler
        implements AuthenticationSuccessHandlerInterface,
        AuthenticationFailureHandlerInterface
    {
        private $router;
    
        public function __construct(Router $router)
        {
            $this->router = $router;
        }
    
        public function onAuthenticationSuccess(Request $request, TokenInterface $token)
        {
            if ($request->isXmlHttpRequest()) {
                // do I need something here?
            } else {
                // If the user tried to access a protected resource and was forces to login
                // redirect him back to that resource
                if ($targetPath = $request->getSession()->get('_security.target_path')) {
                    $url = $targetPath;
                } else {
                    // Otherwise, redirect him to wherever you want
                    $url = $this->router->generate('user_view', array('nickname' => $token->getUser()->getNickname()));
                }
    
                return new RedirectResponse($url);
            }
        }
    
        public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
        {
            if ($request->isXmlHttpRequest()) {
                // Handle XHR here
            } else {
                // Create a flash message with the authentication error message
                $request->getSession()->setFlash('error', $exception->getMessage());
                $url = $this->router->generate('user_login');
    
                return new RedirectResponse($url);
            }
        }
    }
    
  • Определите службу и зарегистрируйте обработчик:

    parameters:
        vendor_security.authentication_handler: UsuarioBundle\Handler\AuthenticationHandler
    
    services:
        authentication_handler:
            class:  %vendor_security.authentication_handler%
            arguments:  [@router]
            tags:
                - { name: 'monolog.logger', channel: 'security' }
    
  • Измените ссылки в security.yml:

    Брандмауэры: главный: шаблон: ^/ форм_логин: поставщик: fos_userbundle csrf_provider: форма.csrf_provider путь к логину: /войти check_path: /проверка входа в систему success_handler: аутентификация_хандлер failure_handler: аутентификация_хандлер

          logout:
               path: fos_user_security_logout
               target: /
               invalidate_session: false
          anonymous: ~
    

Но я получаю эту ошибку, когда пытаюсь войти в систему с неверными учетными данными:

Попытался позвонить метод "Setflash" для класса "Symfony\Компонент\HttpFoundation\Сессия\Сессия" в /var/www/html/src/UsuarioBundle/Handler/AuthenticationHandler.php линия 52.

Почему? Я проверяю метод getSession(), и это часть HttpFoundation, которую я включаю в операторы use, так что я здесь делаю неправильно?

Примечание: Я беру код в основном из этой темы, поэтому у меня все еще есть некоторые сомнения по этому поводу.

Author: Community, 2014-10-03

1 answers

$request->getSession()->setFlash('error', 'error'); было обозначением "старой" версии symfony.

Теперь вы должны использовать

$reqest->getSession()->getFlashBag()->add('error', $exception->getMessage());

Более того, вы уверены, что это хорошая практика показывать $exception текстовое сообщение? Я имею в виду, я не знаю, на какой странице будет показана эта вспышка, НО если пользователь или даже администратор - который, конечно, почти ничего не знает о PHP и программировании в целом - может видеть эту страницу и поэтому сообщение, вы должны попытаться зарегистрировать сообщение для своей цели, НО показать что-то еще пользователю.

 9
Author: DonCallisto, 2014-10-03 09:01:44