<?php
// src/App/EventListener/JWTCreatedListener.php
namespace App\EventListener;
use App\Repository\RoleAclRepository;
use App\Repository\UserAclRepository;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Repository\UserRepository;
use App\Repository\UserRolesRepository;
class JWTCreatedListener
{
/**
* @var RequestStack
*/
private $requestStack;
private $userRepo;
private $userAclRepo;
private $userRoleRepo;
private $roleAclRepo;
/**
* @param RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack, UserRepository $userRepo, UserAclRepository $userAclRepo, UserRolesRepository $userRoleRepo, RoleAclRepository $roleAclRepo)
{
$this->requestStack = $requestStack;
$this->userRepo = $userRepo;
$this->userAclRepo = $userAclRepo;
$this->userRoleRepo = $userRoleRepo;
$this->roleAclRepo = $roleAclRepo;
}
/**
* @param JWTCreatedEvent $event
*
* @return void
*/
public function onJWTCreated(JWTCreatedEvent $event)
{
$request = $this->requestStack->getCurrentRequest();
$payload = $event->getData();
$payload['ip'] = $request->getClientIp();
$user = $this->userRepo->findOneBy(['username'=>$payload['username']]);
$payload['id'] = $user->getId();
$fullName = $user->getUsername();
$payload['type'] = $user->getType();
$payload['actif'] = $user->isIsActivated();
$payload['resetPassword'] = $user->isIsResetPassword();
$payload['userAcl'] = [];
$payload['roleAcl'] = [];
$permissionsAcl = $this->userAclRepo->findBy(['owner'=>$user]);
$tab = [];
if(count($permissionsAcl) > 0){
foreach ($permissionsAcl as $key => $permission) {
$tab[$key]['action'] = $permission->getActionSlug();
$tab[$key]['ressource'] = $permission->getRessourceSlug();
}
}
$payload['userAcl'] = $tab;
$userRoles = $this->userRoleRepo->findBy(['owner'=>$user]);
$roleTab = [];
if(count($userRoles) > 0){
foreach ($userRoles as $key => $ur) {
$roleTab = [$ur->getRole()->getName()];
$permissionRoleAcls = $this->roleAclRepo->findBy(['role'=>$ur]);
if(count($permissionRoleAcls) > 0) {
foreach ($permissionRoleAcls as $key => $perm) {
$roleTab[$ur->getRole()->getName()][$key]['action'] = $perm->getActionSlug();
$roleTab[$ur->getRole()->getName()][$key]['action'] = $perm->getRessourceSlug();
}
}
}
}
$payload['roleAcl'] = $roleTab;
switch ($user->getType()) {
case 'agent_ants':
if($user->getAgent())
$fullName = $user->getAgent()->getLastName().' '.$user->getAgent()->getFirstName();
break;
case 'fiche':
case 'donneur':
if($user->getFiche())
$fullName = $user->getFiche()->getLastName().' '.$user->getFiche()->getFirstName();
break;
case 'ong':
if($user->getOng())
$fullName = $user->getOng()->getDenomination();
break;
}
$payload['fullName'] = $fullName;
$event->setData($payload);
$header = $event->getHeader();
$header['cty'] = 'JWT';
$event->setHeader($header);
}
}