<?php
namespace App\EventSubscriber;
use App\Entity\Management\StaffAccount;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class StaffLoginSubscriber implements EventSubscriberInterface
{
private LoggerInterface $logger;
public function __construct(LoggerInterface $staffAuthLogger)
{
$this->logger = $staffAuthLogger;
}
public static function getSubscribedEvents(): iterable
{
return [
InteractiveLoginEvent::class => 'onLogin',
];
}
public function onLogin(InteractiveLoginEvent $event): void
{
$authenticationToken = $event->getAuthenticationToken();
$user = $authenticationToken->getUser();
if (!$user instanceof StaffAccount) {
return;
}
$request = $event->getRequest();
$clientIp = $request->getClientIp();
$mode = in_array(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED, $authenticationToken->getRoleNames())
? 'remember_me' : 'password';
$this->logger->info('User {user} [{user_id}] authenticated with "{mode}".', [
'user' => $user->getUsername(),
'user_id' => $user->getId(),
'mode' => $mode,
'client_ip' => $clientIp,
]);
}
}