是否可以在KernelEvents::CONTROLLER
侦听器中注销用户?
如果是,怎么办?
在此侦听器中,我从数据库中获取了一些数据并将其放入服务中。但是,如果查询未返回任何数据,则我想添加一条即时消息并注销用户。 如何实现呢?
答案 0 :(得分:1)
您可以创建一个简单的登出路由,并在安全性参数(take a look)下对其进行配置。
但是,如果您坚持要取决于您要构建的内容。您可以为kernel.controller
事件创建事件订阅者。
正如提到的 here kernel.controller
(aka KernelEvents :: CONTROLLER),在执行控制器之前,侦听器会在每个请求上得到通知。因此,首先,您需要某种方法来识别与请求匹配的控制器是否需要。
use Symfony\Component\Security\Core\SecurityContext;
...
class LogoutSubscriber implements EventSubscriberInterface
{
/**
* @var SecurityContext
*/
private $securityContext;
public function __construct(SecurityContext $securityContext)
{
$this->securityContext = $securityContext;
}
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
if ($controller[0] instanceof YourController) {
//Log out only if this method returns false
$s = $this->someService->init();
if(false === $s) {
//Then logout here
//Pass parameters to the controller
//which has logout method to invalidate session
//null the token and add Flash message
$controller = new SecurityController();
$controller->setRouter($this->router);
$controller->setSession($this->session);
$controller->setTokenStorage($this->tokenStorage);
$controller->setTranslator($this->translator);
$replacementController = array($controller, 'logout');
$event->setController($replacementController);
}
}
}
public static function getSubscribedEvents()
{
return array(
KernelEvents::CONTROLLER => 'onKernelController',
);
}
}
如果您想要更多然后注销,则只需注入适当的依赖项并将其使用(例如,用于速写消息),注入标记有Symfony\Component\HttpFoundation\Session\Session
的{{1}}
然后只需致电session