SwitchUserSubscriber.php 5.48 KB
Newer Older
1 2 3
<?php
namespace App\EventListener;

4
use Doctrine\ORM\EntityManagerInterface;
5 6 7
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
8
use Symfony\Component\Security\Core\Role\SwitchUserRole;
9 10
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
use Symfony\Component\Security\Http\SecurityEvents;
11
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
12 13 14 15

class SwitchUserSubscriber implements EventSubscriberInterface
{
    private $router;
16
    private $em;
17 18 19 20 21 22

    /**
     * SwitchUserSubscriber constructor.
     *
     * @param RouterInterface $router
     */
23
    public function __construct(RouterInterface $router, EntityManagerInterface $em)
24 25
    {
        $this->router = $router;
26
        $this->em = $em;
27 28 29 30
    }

    public function onSwitchUser(SwitchUserEvent $event)
    {
Julien Jorry committed
31 32 33
        $request = $event->getRequest();
        $token = $event->getToken();
        $user = $event->getTargetUser();
34

Julien Jorry committed
35 36 37
        $request->getSession()->remove('_prestagere');
        $request->getSession()->remove('_comptoirgere');
        $request->getSession()->remove('_groupegere');
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

        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);
Julien Jorry committed
53
            } else {
54 55 56 57 58 59 60 61 62 63 64 65 66
                $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) {
Julien Jorry committed
67
                    if (in_array('ROLE_SUPER_ADMIN', $groupe->getRoles())) {
68 69 70 71 72 73 74 75
                        $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);
Julien Jorry committed
76 77
                    }
                }
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
                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]);
                }
Julien Jorry committed
94 95
            }
        }
96 97
    }

98 99 100 101 102 103 104 105 106
    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);
    }

107 108 109 110 111 112 113 114
    public static function getSubscribedEvents()
    {
        return [
            // constant for security.switch_user
            SecurityEvents::SWITCH_USER => 'onSwitchUser',
        ];
    }
}