<?php
/**
* Custom response success auth
*
* @package RMCS
* @author Vlad Shashkov <vlad.s@zimalab.com>
* @copyright 2014 - 2019 The Zimalab
*/
declare(strict_types=1);
namespace App\EventListener;
use Doctrine\Persistence\{ManagerRegistry, ObjectManager};
use Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Symfony\Component\Security\Core\User\UserInterface;
class JWTAuthenticatedListener
{
/**
* @var ObjectManager
*/
private $em;
public function __construct(ManagerRegistry $registry)
{
$this->em = $registry->getManager('default');
}
/**
* Event auth success
*
* @param AuthenticationSuccessEvent $event
*/
public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event):void
{
$this->removeOldToken();
$this->setRolesResponse($event);
}
/**
* Remove old refresh token
*/
private function removeOldToken():void
{
$refreshTokens = $this->em
->getRepository(RefreshToken::class)
->findInvalid();
if (!empty($refreshTokens)) {
foreach ($refreshTokens as $refreshToken) {
$this->em->remove($refreshToken);
}
$this->em->flush();
}
}
/**
* Set response role
*
* @param AuthenticationSuccessEvent $event
*/
private function setRolesResponse(AuthenticationSuccessEvent $event):void
{
$data = $event->getData();
$user = $event->getUser();
if (!$user instanceof UserInterface) {
return;
}
$data['roles'] = $user->getRoles();
$event->setData($data);
}
}