Skip to content

Commit d5db9d8

Browse files
committed
fix(security): user login programmatically with dedicated user checker on a firewall
1 parent bf1ffd3 commit d5db9d8

File tree

4 files changed

+21
-1
lines changed

4 files changed

+21
-1
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,14 @@ private function createFirewall(ContainerBuilder $container, string $id, array $
424424
$container->register('security.user_checker.chain.'.$id, ChainUserChecker::class)
425425
->addArgument(new TaggedIteratorArgument('security.user_checker.'.$id));
426426

427+
// Register Firewall-specific user checker for 'security.helper' login()
428+
$securityUserCheckerLocator = $container->getDefinition('security.user_checker_locator');
429+
$securityUserCheckerLocator
430+
->replaceArgument(0, array_merge($securityUserCheckerLocator->getArgument(0), [
431+
'security.user_checker.'.$id => new ServiceClosureArgument(new Reference('security.user_checker.'.$id)),
432+
]))
433+
;
434+
427435
// Register listeners
428436
$listeners = [];
429437
$listenerKeys = [];

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Symfony\Bundle\SecurityBundle\Security\FirewallContext;
2020
use Symfony\Bundle\SecurityBundle\Security\FirewallMap;
2121
use Symfony\Bundle\SecurityBundle\Security\LazyFirewallContext;
22+
use Symfony\Component\DependencyInjection\ServiceLocator;
2223
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
2324
use Symfony\Component\Ldap\Security\LdapUserProvider;
2425
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
@@ -80,6 +81,9 @@
8081

8182
->set('security.untracked_token_storage', TokenStorage::class)
8283

84+
->set('security.user_checker_locator', ServiceLocator::class)
85+
->args([[]])
86+
8387
->set('security.helper', Security::class)
8488
->args([
8589
service_locator([
@@ -89,6 +93,7 @@
8993
'request_stack' => service('request_stack'),
9094
'security.firewall.map' => service('security.firewall.map'),
9195
'security.user_checker' => service('security.user_checker'),
96+
'security.user_checker_locator' => service('security.user_checker_locator'),
9297
'security.firewall.event_dispatcher_locator' => service('security.firewall.event_dispatcher_locator'),
9398
'security.csrf.token_manager' => service('security.csrf.token_manager')->ignoreOnInvalid(),
9499
]),

src/Symfony/Bundle/SecurityBundle/Security.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,11 @@ public function login(UserInterface $user, ?string $authenticatorName = null, ?s
127127

128128
$authenticator = $this->getAuthenticator($authenticatorName, $firewallName);
129129

130-
$this->container->get('security.user_checker')->checkPreAuth($user);
130+
if ($this->container->get('security.user_checker_locator')->has('security.user_checker.'.$firewallName)) {
131+
$this->container->get('security.user_checker_locator')->get('security.user_checker.'.$firewallName)->checkPreAuth($user);
132+
} else {
133+
$this->container->get('security.user_checker')->checkPreAuth($user);
134+
}
131135

132136
return $this->container->get('security.authenticator.managers_locator')->get($firewallName)->authenticateUser($user, $authenticator, $request, $badges);
133137
}

src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ public function testLogin()
143143
['security.firewall.map', $firewallMap],
144144
['security.authenticator.managers_locator', $this->createContainer('main', $userAuthenticator)],
145145
['security.user_checker', $userChecker],
146+
['security.user_checker_locator', $this->createContainer('security.user_checker.main', $userChecker)],
146147
])
147148
;
148149

@@ -189,6 +190,7 @@ public function testLoginReturnsAuthenticatorResponse()
189190
['security.firewall.map', $firewallMap],
190191
['security.authenticator.managers_locator', $this->createContainer('main', $userAuthenticator)],
191192
['security.user_checker', $userChecker],
193+
['security.user_checker_locator', $this->createContainer('security.user_checker.main', $userChecker)],
192194
])
193195
;
194196

@@ -238,6 +240,7 @@ public function testLoginWithoutAuthenticatorThrows()
238240
['request_stack', $requestStack],
239241
['security.firewall.map', $firewallMap],
240242
['security.user_checker', $userChecker],
243+
['security.user_checker_locator', $this->createContainer('security.user_checker.main', $userChecker)],
241244
])
242245
;
243246

0 commit comments

Comments
 (0)