我想在我的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
为什么我无法重定向被视为"禁用的用户"到特定的路线?
第二点,这被认为是一种好习惯吗?
答案 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