在Symfony2中从AuthenticationHandler设置flashMessage

时间:2014-10-03 05:33:51

标签: php ajax symfony login fosuserbundle

我遇到了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中的引用:

    防火墙:       主要:           模式:^ /           form_login:               提供者:fos_userbundle               csrf_provider:form.csrf_provider               login_path:/ login               check_path:/ login_check               success_handler:authentication_handler               failure_handler:authentication_handler

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

但是当我尝试使用无效凭据登录时出现此错误:

  

尝试调用方法&#34; setFlash&#34;在课堂上   &#34; Symfony的\元器件\ HttpFoundation \会话\会话&#34;在   /var/www/html/src/UsuarioBundle/Handler/AuthenticationHandler.php line   52。

为什么呢?我检查了getSession()方法以及我HttpFoundation语句中包含的use方法的一部分,所以我在这里做错了什么?

注意:我主要从this话题中获取代码,因此我仍然对此有所怀疑。

1 个答案:

答案 0 :(得分:9)

$request->getSession()->setFlash('error', 'error');是&#34; old&#34;的标记。 symfony版本。

现在你应该使用

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

此外,您确定显示$exception短信是一种很好的做法吗?我的意思是,我不知道在哪个页面上会显示这个闪存,但是如果用户,甚至是管理员 - 当然对PHP和编程一般都不了解 - 可以看到页面等消息,您应该尝试为您的目的记录消息但是向用户显示其他内容。