【发布时间】:2018-02-01 01:13:17
【问题描述】:
问题:如何通过给定的防火墙名称获取form_login.check_path?
我们订阅Symfony\Component\Security\Http\SecurityEvent::INTERACTIVE_LOGIN 是为了在具有多个防火墙的应用程序中记录成功登录。
一个防火墙通过 Guard 身份验证使用 JWT 令牌,这具有负面影响,即对于具有有效令牌的每个请求都会触发此事件。
我们目前已通过手动检查当前路由是否与防火墙的检查路径匹配并停止事件传播以及提前返回来解决此问题。
随着我们添加更多防火墙(使用不同的令牌),我想更一般地解决这个问题。因此,我想检查当前路由是否与当前防火墙检查路径匹配而不硬编码任何路由或防火墙名称。
有一个类可以为 Twig logout_path() 方法使用的当前防火墙生成 注销 URL,该方法以某种方式从防火墙侦听器获取注销路由/路径。 (Symfony\Component\Security\Http\Logout\LogoutUrlGenerator)
在我进入一个漫长的调试会话之前,我想也许有人以前解决过这个案例;)
有什么想法吗?
示例代码:
class UserEventSubscriber implements EventSubscriberInterface
{
/** @var LoggerInterface */
protected $logger;
/** @var FirewallMapInterface|FirewallMap */
protected $firewallMap;
public function __construct(LoggerInterface $logger, FirewallMapInterface $firewallMap)
{
$this->logger = $logger;
$this->firewallMap = $firewallMap;
}
public function onInteractiveLogin(InteractiveLoginEvent $event)
{
$request = $event->getRequest();
$firewallName = $this->firewallMap->getFirewallConfig($request)->getName();
$routeName = $request->get('_route');
if (('firewall_jwt' === $firewallName) && ('firewall_jwt_login_check' !== $routeName)) {
$event->stopPropagation();
return;
}
$this->logger->info(
'A User has logged in interactively.',
array(
'event' => SecurityEvents::INTERACTIVE_LOGIN,
'user' => $event->getAuthenticationToken()->getUser()->getUuid(),
));
【问题讨论】:
-
你使用的是 Symfony 版本 check_path 上,然后是 job is done! Documentation.
-
@yceruto 我知道 JSON 身份验证,但问题是登录 (
form_login/json_login) 和身份验证过程本身是两个不同的过程。要使 JWT 令牌正常工作,您需要保护或自定义身份验证提供程序。触发SecurityEvents::INTERACTIVE_LOGIN的防火墙甚至没有设置form_login选项,但只要保护身份验证成功,仍会触发这些事件。我们正在使用第二个防火墙,它只允许匿名访问登录/注册/注销/密码重置路由。你明白吗? -
是的,我愿意。您可能需要手动执行此操作,即将此配置注入订阅者。在答案中看到一个想法:)
标签: symfony