<?php
namespace App\EventSubscribers;
use App\Entity\Portal\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
class RoleChangeSubscriber implements EventSubscriberInterface {
/**
* @var TokenStorage
*/
protected $tokenStorage;
/**
* YourRoleListener constructor.
* @param TokenStorage $tokenStorage The token storage for the user
*/
public function __construct(TokenStorageInterface $tokenStorage) {
$this->tokenStorage = $tokenStorage;
}
/**
* Handles the kernel event.
*
* @param ControllerEvent $event The dispatched event
*/
public function onKernelController(ControllerEvent $event) {
if ($this->tokenStorage && $this->tokenStorage->getToken() && !($this->tokenStorage->getToken() instanceof SwitchUserToken)) {
$token = $this->tokenStorage->getToken();
$user = $token->getUser();
// This check can be just `is_object` like in symfony core
// we're explicit about the class used
if ($user instanceof User) {
// there didn't seem to be an easier way to grab the provider key,
// so using bound closure to retrieve it
$providerKeyGetter = function (TokenInterface $token) {
return $token->getFirewallName();
};
$boundProviderKeyGetter = \Closure::bind($providerKeyGetter, null, $token);
// check & load roles for user here if necessary
// $this->tokenStorage->setToken(
// new UsernamePasswordToken(
// $user,
// $token->getCredentials(),
// $boundProviderKeyGetter($token),
// $user->getRoles()
// )
// );
}
}
}
/** {@inheritdoc} */
public static function getSubscribedEvents() {
return [KernelEvents::CONTROLLER => ['onKernelController', 99]];
}
}