Skip to content

Commit e7b04b5

Browse files
MatTheCatfabpot
authored andcommitted
[SecurityBundle] Do not replace authenticators service by their traceable version
1 parent 4bed202 commit e7b04b5

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

DependencyInjection/SecurityExtension.php

+6-4
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,13 @@ private function createAuthenticationListeners(ContainerBuilder $container, stri
643643
}
644644

645645
if ($container->hasDefinition('debug.security.firewall')) {
646-
foreach ($authenticationProviders as $authenticatorId) {
647-
$container->register('debug.'.$authenticatorId, TraceableAuthenticator::class)
648-
->setDecoratedService($authenticatorId)
649-
->setArguments([new Reference('debug.'.$authenticatorId.'.inner')])
646+
foreach ($authenticationProviders as &$authenticatorId) {
647+
$traceableId = 'debug.'.$authenticatorId;
648+
$container
649+
->register($traceableId, TraceableAuthenticator::class)
650+
->setArguments([new Reference($authenticatorId)])
650651
;
652+
$authenticatorId = $traceableId;
651653
}
652654
}
653655

Tests/DependencyInjection/SecurityExtensionTest.php

+26
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
2121
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
2222
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
23+
use Symfony\Component\DependencyInjection\Compiler\DecoratorServicePass;
2324
use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass;
25+
use Symfony\Component\DependencyInjection\Compiler\ResolveReferencesToAliasesPass;
2426
use Symfony\Component\DependencyInjection\ContainerBuilder;
2527
use Symfony\Component\DependencyInjection\Reference;
2628
use Symfony\Component\ExpressionLanguage\Expression;
@@ -900,6 +902,30 @@ public function testCustomHasherWithMigrateFrom()
900902
]);
901903
}
902904

905+
public function testAuthenticatorsDecoration()
906+
{
907+
$container = $this->getRawContainer();
908+
$container->setParameter('kernel.debug', true);
909+
$container->getCompilerPassConfig()->setOptimizationPasses([
910+
new ResolveChildDefinitionsPass(),
911+
new DecoratorServicePass(),
912+
new ResolveReferencesToAliasesPass(),
913+
]);
914+
915+
$container->register(TestAuthenticator::class);
916+
$container->loadFromExtension('security', [
917+
'firewalls' => ['main' => ['custom_authenticator' => TestAuthenticator::class]],
918+
]);
919+
$container->compile();
920+
921+
/** @var Reference[] $managerAuthenticators */
922+
$managerAuthenticators = $container->getDefinition('security.authenticator.manager.main')->getArgument(0);
923+
$this->assertCount(1, $managerAuthenticators);
924+
$this->assertSame('debug.'.TestAuthenticator::class, (string) reset($managerAuthenticators), 'AuthenticatorManager must be injected traceable authenticators in debug mode.');
925+
926+
$this->assertTrue($container->hasDefinition(TestAuthenticator::class), 'Original authenticator must still exist in the container so it can be used outside of the AuthenticatorManager’s context.');
927+
}
928+
903929
protected function getRawContainer()
904930
{
905931
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)