<?php
declare(strict_types=1);
namespace App\Bundles\UserBundle\EventListener;
use App\Bundles\UserBundle\Entity\UserInterface;
use App\Bundles\UserBundle\Service\Session\SessionGeneratedIdentifierSaver;
use App\Bundles\UserBundle\Service\User\UserService;
use Scheb\TwoFactorBundle\Security\Http\Authenticator\TwoFactorAuthenticator;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
#[AsEventListener(event: LoginSuccessEvent::class, method: 'onSuccessLogin')]
class SecurityEventsListener
{
public const GENERATED_SESSION_ID = 'generated_session_id';
public function __construct(
private readonly UserService $userService,
private readonly SessionGeneratedIdentifierSaver $sessionGeneratedIdentifierSaver,
) {
}
public function onSuccessLogin(LoginSuccessEvent $event): void
{
$token = $event->getAuthenticatedToken();
if (
!$token->hasAttribute(TwoFactorAuthenticator::FLAG_2FA_COMPLETE) ||
$token->getAttribute(TwoFactorAuthenticator::FLAG_2FA_COMPLETE) === false
) {
return;
}
/** @var UserInterface $user */
$user = $event->getUser();
$this->userService->updateLastLoginAt($user);
$this->sessionGeneratedIdentifierSaver->save();
}
}