Skip to content

Commit d014fc4

Browse files
committed
[Security] Allow configuring a target url when switching user
1 parent 18809d8 commit d014fc4

File tree

4 files changed

+7
-2
lines changed

4 files changed

+7
-2
lines changed

src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php

+1
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ private function addFirewallsSection(ArrayNodeDefinition $rootNode, array $facto
244244
->scalarNode('provider')->end()
245245
->scalarNode('parameter')->defaultValue('_switch_user')->end()
246246
->scalarNode('role')->defaultValue('ROLE_ALLOWED_TO_SWITCH')->end()
247+
->scalarNode('target_url')->defaultValue(null)->end()
247248
->end()
248249
->end()
249250
->arrayNode('required_badges')

src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php

+1
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ private function createSwitchUserListener(ContainerBuilder $container, string $i
830830
$listener->replaceArgument(6, $config['parameter']);
831831
$listener->replaceArgument(7, $config['role']);
832832
$listener->replaceArgument(9, $stateless);
833+
$listener->replaceArgument(10, $config['target_url']);
833834

834835
return $switchUserListenerId;
835836
}

src/Symfony/Bundle/SecurityBundle/Resources/config/security_listeners.php

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
'ROLE_ALLOWED_TO_SWITCH',
151151
service('event_dispatcher')->nullOnInvalid(),
152152
false, // Stateless
153+
abstract_arg('Target Url'),
153154
])
154155
->tag('monolog.logger', ['channel' => 'security'])
155156

src/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ class SwitchUserListener extends AbstractListener
5151
private ?LoggerInterface $logger;
5252
private ?EventDispatcherInterface $dispatcher;
5353
private bool $stateless;
54+
private ?string $targetUrl;
5455

55-
public function __construct(TokenStorageInterface $tokenStorage, UserProviderInterface $provider, UserCheckerInterface $userChecker, string $firewallName, AccessDecisionManagerInterface $accessDecisionManager, LoggerInterface $logger = null, string $usernameParameter = '_switch_user', string $role = 'ROLE_ALLOWED_TO_SWITCH', EventDispatcherInterface $dispatcher = null, bool $stateless = false)
56+
public function __construct(TokenStorageInterface $tokenStorage, UserProviderInterface $provider, UserCheckerInterface $userChecker, string $firewallName, AccessDecisionManagerInterface $accessDecisionManager, LoggerInterface $logger = null, string $usernameParameter = '_switch_user', string $role = 'ROLE_ALLOWED_TO_SWITCH', EventDispatcherInterface $dispatcher = null, bool $stateless = false, ?string $targetUrl = null)
5657
{
5758
if ('' === $firewallName) {
5859
throw new \InvalidArgumentException('$firewallName must not be empty.');
@@ -68,6 +69,7 @@ public function __construct(TokenStorageInterface $tokenStorage, UserProviderInt
6869
$this->logger = $logger;
6970
$this->dispatcher = $dispatcher;
7071
$this->stateless = $stateless;
72+
$this->targetUrl = $targetUrl;
7173
}
7274

7375
/**
@@ -122,7 +124,7 @@ public function authenticate(RequestEvent $event)
122124
if (!$this->stateless) {
123125
$request->query->remove($this->usernameParameter);
124126
$request->server->set('QUERY_STRING', http_build_query($request->query->all(), '', '&'));
125-
$response = new RedirectResponse($request->getUri(), 302);
127+
$response = new RedirectResponse($this->targetUrl ?? $request->getUri(), 302);
126128

127129
$event->setResponse($response);
128130
}

0 commit comments

Comments
 (0)