Symfony 3 - LoginAction上的监听器 - kernelException

时间:2016-06-09 06:47:27

标签: php symfony

说明

我想在我的LoginAction上使用一个Listener但是我正在使用的那个,但是没有工作。

我有一个实体:

class User implements AdvancedUserInterface {
  public function isEnabled(){}
    ...
  }
}

所以,当我尝试连接我的用户时,我有一个好消息:

  

用户已停用

在这个动作上,我使用像这样的ExceptionListener:

# src/AppBundle/EventListener/ExceptionListener.php
namespace AppBundle\EventListener;


use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Exception\DisabledException;

class ExceptionListener
{
    private $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        die('-------');

        $ex = $event->getException();
        if($ex instanceof DisabledException) {
            $url = $this->router->generate('accounts.please_activate');
            $response = new RedirectResponse($url);

            $event->setResponse($response);
        }
    }
}

我的倾听者工作原因,如果我在构造中执行了die,那没关系,但是,我的die无法在函数{{1}中工作}

所以我重定向到特定路线并不起作用......

onKernelException

services.yml

问题:

为什么我无法重定向被视为"禁用的用户"到特定的路线?

第二点,这被认为是一种好习惯吗?

1 个答案:

答案 0 :(得分:2)

您应该使用自定义登录处理程序处理登录失败。

Creare一个实现Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface的新服务:

namespace AppBundle\Security;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\DisabledException;

class FailLoginHandler implements AuthenticationFailureHandlerInterface
{
    private $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        if($exception instanceof DisabledException) {
            $url = $this->router->generate('accounts.please_activate');
            return new RedirectResponse($url);
        }
    }
}

定义新服务

services:
    app.login_fail:
        class:        AppBundle\Security\FailLoginHandler
        arguments:    ['@router']

然后在 security.yml 的防火墙配置下添加failure_handler选项:

security:
    firewalls:
        firewallname:
             failure_handler: app.login_fail