summaryrefslogtreecommitdiffstats
path: root/Http/Firewall
diff options
context:
space:
mode:
authorGrégoire Pineau <lyrixx@lyrixx.info>2016-04-03 22:28:33 +0200
committerGrégoire Pineau <lyrixx@lyrixx.info>2016-04-04 14:27:18 +0200
commit8930c053da78b96618182f855d8b5f0de5de4e14 (patch)
treedae68a870f0e859d296d01741387caabf53f1070 /Http/Firewall
parentf9e167fde187546f3eb91f62d8de5ba36483a70a (diff)
downloadsymfony-security-8930c053da78b96618182f855d8b5f0de5de4e14.zip
symfony-security-8930c053da78b96618182f855d8b5f0de5de4e14.tar.gz
symfony-security-8930c053da78b96618182f855d8b5f0de5de4e14.tar.bz2
[Security] Fixed SwitchUserListener when exiting an impersonication with AnonymousToken
If you configure a firewall with switch user with `role: IS_AUTHENTICATED_ANONYMOUSLY` it's impossible to exit the impersonation because the next line `$this->provider->refreshUser($original->getUser())` will fail. It fails because `RefreshUser` expects an instance of `UserInterface` and here it's a string. Therefore, it does not make sense to refresh an Anonymous Token, right ?
Diffstat (limited to 'Http/Firewall')
-rw-r--r--Http/Firewall/SwitchUserListener.php3
1 files changed, 2 insertions, 1 deletions
diff --git a/Http/Firewall/SwitchUserListener.php b/Http/Firewall/SwitchUserListener.php
index 79b715a..b983b68 100644
--- a/Http/Firewall/SwitchUserListener.php
+++ b/Http/Firewall/SwitchUserListener.php
@@ -13,6 +13,7 @@ namespace Symfony\Component\Security\Http\Firewall;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\SecurityContextInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
@@ -162,7 +163,7 @@ class SwitchUserListener implements ListenerInterface
throw new AuthenticationCredentialsNotFoundException('Could not find original Token object.');
}
- if (null !== $this->dispatcher) {
+ if (null !== $this->dispatcher && $original->getUser() instanceof UserInterface) {
$user = $this->provider->refreshUser($original->getUser());
$switchEvent = new SwitchUserEvent($request, $user);
$this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);