<?php namespace App\EventListener; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Security\Core\Role\SwitchUserRole; use Symfony\Component\Security\Http\Event\SwitchUserEvent; use Symfony\Component\Security\Http\SecurityEvents; use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken; class SwitchUserSubscriber implements EventSubscriberInterface { private $router; private $em; /** * SwitchUserSubscriber constructor. * * @param RouterInterface $router */ public function __construct(RouterInterface $router, EntityManagerInterface $em) { $this->router = $router; $this->em = $em; } public function onSwitchUser(SwitchUserEvent $event) { $request = $event->getRequest(); $token = $event->getToken(); $user = $event->getTargetUser(); $request->getSession()->remove('_prestagere'); $request->getSession()->remove('_comptoirgere'); $request->getSession()->remove('_groupegere'); if ($user->getPossiblegroups()->count() == 1) { if (count($user->getGroups()) != 1) { $groupe = $user->getPossiblegroups()->first(); if (in_array('ROLE_PRESTATAIRE', $groupe->getRoles()) && count($user->getPrestataires()) >= 1) { $request->getSession()->set('_prestagere', $user->getPrestataires()[0]); } elseif (in_array('ROLE_COMPTOIR', $groupe->getRoles()) && count($user->getComptoirsGeres()) >= 1) { $request->getSession()->set('_comptoirgere', $user->getComptoirsGeres()[0]); } elseif ((in_array('ROLE_TRESORIER', $groupe->getRoles()) || in_array('ROLE_CONTACT', $groupe->getRoles()) || in_array('ROLE_GESTION_GROUPE', $groupe->getRoles())) && count($user->getGroupesGeres()) >= 1) { $request->getSession()->set('_groupegere', $user->getGroupesGeres()[0]); } $user->setGroups([$groupe]); $this->em->persist($user); $this->em->flush(); $this->updateToken($event, $user, $token); } else { $groupe = $user->getGroups()->first(); if (in_array('ROLE_PRESTATAIRE', $groupe->getRoles()) && count($user->getPrestataires()) >= 1) { $request->getSession()->set('_prestagere', $user->getPrestataires()[0]); } elseif (in_array('ROLE_COMPTOIR', $groupe->getRoles()) && count($user->getComptoirsGeres()) >= 1) { $request->getSession()->set('_comptoirgere', $user->getComptoirsGeres()[0]); } elseif ((in_array('ROLE_TRESORIER', $groupe->getRoles()) || in_array('ROLE_CONTACT', $groupe->getRoles()) || in_array('ROLE_GESTION_GROUPE', $groupe->getRoles())) && count($user->getGroupesGeres()) >= 1) { $request->getSession()->set('_groupegere', $user->getGroupesGeres()[0]); } } } elseif ($user->getPossiblegroups()->count() > 1) { if ($user->getGroups()->count() != 1) { $hasSuperAdminRole = false; foreach ($user->getPossiblegroups() as $groupe) { if (in_array('ROLE_SUPER_ADMIN', $groupe->getRoles())) { $hasSuperAdminRole = true; $user->setGroups([]); $this->em->persist($user); $this->em->flush(); $user->setGroups([$groupe]); $this->em->persist($user); $this->em->flush(); $this->updateToken($event, $user, $token); } } if (!$hasSuperAdminRole) { $user->setGroups([]); $user->setRoles(['ROLE_USER']); $this->em->persist($user); $this->em->flush(); $this->updateToken($event, $user, $token); } } else { $groupe = $user->getGroups()->first(); if (in_array('ROLE_PRESTATAIRE', $groupe->getRoles()) && count($user->getPrestataires()) >= 1) { $request->getSession()->set('_prestagere', $user->getPrestataires()[0]); } elseif (in_array('ROLE_COMPTOIR', $groupe->getRoles()) && count($user->getComptoirsGeres()) >= 1) { $request->getSession()->set('_comptoirgere', $user->getComptoirsGeres()[0]); } elseif ((in_array('ROLE_TRESORIER', $groupe->getRoles()) || in_array('ROLE_CONTACT', $groupe->getRoles()) || in_array('ROLE_GESTION_GROUPE', $groupe->getRoles())) && count($user->getGroupesGeres()) >= 1) { $request->getSession()->set('_groupegere', $user->getGroupesGeres()[0]); } } } } private function updateToken($event, $user, $token) { $roles = $user->getRoles(); $roles[] = new SwitchUserRole('ROLE_PREVIOUS_ADMIN', $token, false); $token = new SwitchUserToken($user, $user->getPassword(), 'main', $roles, $event->getToken()->getOriginalToken()); $event->setToken($token); } public static function getSubscribedEvents() { return [ // constant for security.switch_user SecurityEvents::SWITCH_USER => 'onSwitchUser', ]; } }