Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb3d71a7

Browse files
committed
Require authenticators to be the entry-point for autoregistration
This allows automatic registration of the security if 1 entry point isavailable.
1 parentc37aefd commitb3d71a7

File tree

12 files changed

+137
-96
lines changed

12 files changed

+137
-96
lines changed

‎src/Symfony/Bundle/SecurityBundle/CHANGELOG.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ CHANGELOG
88
* Added`SortFirewallListenersPass` to make the execution order of firewall listeners configurable by
99
leveraging`Symfony\Component\Security\Http\Firewall\FirewallListenerInterface`
1010
* Added ability to use comma separated ip address list for`security.access_control`
11+
*[BC break] Removed`EntryPointFactoryInterface`, authenticators must now implement`AuthenticationEntryPointInterface` if
12+
they require autoregistration of a Security entry point.
1113

1214
5.1.0
1315
-----
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler;
13+
14+
useSymfony\Component\Config\Definition\Exception\InvalidConfigurationException;
15+
useSymfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16+
useSymfony\Component\DependencyInjection\ContainerBuilder;
17+
useSymfony\Component\DependencyInjection\Reference;
18+
useSymfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
19+
20+
/**
21+
* @author Wouter de Jong <wouter@wouterj.nl>
22+
*/
23+
class RegisterEntryPointPassimplements CompilerPassInterface
24+
{
25+
publicfunctionprocess(ContainerBuilder$container)
26+
{
27+
if (!$container->hasParameter('security.firewalls')) {
28+
return;
29+
}
30+
31+
$firewalls =$container->getParameter('security.firewalls');
32+
foreach ($firewallsas$firewallName) {
33+
if (!$container->hasDefinition('security.authenticator.manager.'.$firewallName) || !$container->hasParameter('security.'.$firewallName.'._indexed_authenticators')) {
34+
continue;
35+
}
36+
37+
$entryPoints = [];
38+
$indexedAuthenticators =$container->getParameter('security.'.$firewallName.'._indexed_authenticators');
39+
foreach ($indexedAuthenticatorsas$key =>$authenticatorId) {
40+
if (!$container->has($authenticatorId)) {
41+
continue;
42+
}
43+
44+
$definition =$container->findDefinition($authenticatorId);
45+
if (is_a($definition->getClass(), AuthenticationEntryPointInterface::class,true)) {
46+
$entryPoints[$key] =$authenticatorId;
47+
}
48+
}
49+
50+
if (!$entryPoints) {
51+
return;
52+
}
53+
54+
$config =$container->getDefinition('security.firewall.map.config.'.$firewallName);
55+
$configuredEntryPoint =$config->getArgument(7);
56+
57+
if (null !==$configuredEntryPoint) {
58+
// allow entry points to be configured by authenticator key (e.g. "http_basic")
59+
$entryPoint =$entryPoints[$configuredEntryPoint] ??$configuredEntryPoint;
60+
}elseif (\count($entryPoints) ===1) {
61+
$entryPoint =array_shift($entryPoints);
62+
}else {
63+
$entryPointNames = [];
64+
foreach ($entryPointsas$key =>$class) {
65+
$entryPointNames[] =is_numeric($key) ?$class :$key;
66+
}
67+
68+
thrownewInvalidConfigurationException(sprintf('Because you have multiple authenticators in firewall "%s", you need to set the "entry_point" key to one of your authenticators ("%s") or a service ID implementing "%s". The "entry_point" determines what should happen (e.g. redirect to "/login") when an anonymous user tries to access a protected page.',$firewallName,implode('", "',$entryPointNames), AuthenticationEntryPointInterface::class));
69+
}
70+
71+
$config->replaceArgument(7,$entryPoint);
72+
$container->getDefinition('security.exception_listener.'.$firewallName)->replaceArgument(4,newReference($entryPoint));
73+
}
74+
}
75+
}

‎src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/EntryPointFactoryInterface.php‎

Lines changed: 0 additions & 30 deletions
This file was deleted.

‎src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/FormLoginFactory.php‎

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
*
2626
* @internal
2727
*/
28-
class FormLoginFactoryextends AbstractFactoryimplements AuthenticatorFactoryInterface, EntryPointFactoryInterface
28+
class FormLoginFactoryextends AbstractFactoryimplements AuthenticatorFactoryInterface
2929
{
3030
publicfunction__construct()
3131
{
@@ -94,12 +94,7 @@ protected function createListener(ContainerBuilder $container, string $id, array
9494

9595
protectedfunctioncreateEntryPoint(ContainerBuilder$container,string$id,array$config, ?string$defaultEntryPointId)
9696
{
97-
return$this->registerEntryPoint($container,$id,$config);
98-
}
99-
100-
publicfunctionregisterEntryPoint(ContainerBuilder$container,string$firewallName,array$config):string
101-
{
102-
$entryPointId ='security.authentication.form_entry_point.'.$firewallName;
97+
$entryPointId ='security.authentication.form_entry_point.'.$id;
10398
$container
10499
->setDefinition($entryPointId,newChildDefinition('security.authentication.form_entry_point'))
105100
->addArgument(newReference('security.http_utils'))
@@ -118,13 +113,17 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
118113

119114
$authenticatorId ='security.authenticator.form_login.'.$firewallName;
120115
$options =array_intersect_key($config,$this->options);
121-
$container
116+
$authenticator =$container
122117
->setDefinition($authenticatorId,newChildDefinition('security.authenticator.form_login'))
123118
->replaceArgument(1,newReference($userProviderId))
124119
->replaceArgument(2,newReference($this->createAuthenticationSuccessHandler($container,$firewallName,$config)))
125120
->replaceArgument(3,newReference($this->createAuthenticationFailureHandler($container,$firewallName,$config)))
126121
->replaceArgument(4,$options);
127122

123+
if ($options['use_forward'] ??false) {
124+
$authenticator->addMethodCall('setHttpKernel', [newReference('http_kernel')]);
125+
}
126+
128127
return$authenticatorId;
129128
}
130129
}

‎src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/GuardAuthenticationFactory.php‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
*
2828
* @internal
2929
*/
30-
class GuardAuthenticationFactoryimplements SecurityFactoryInterface, AuthenticatorFactoryInterface, EntryPointFactoryInterface
30+
class GuardAuthenticationFactoryimplements SecurityFactoryInterface, AuthenticatorFactoryInterface
3131
{
3232
publicfunctiongetPosition()
3333
{
@@ -102,6 +102,10 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
102102
$userProvider =newReference($userProviderId);
103103
$authenticatorIds = [];
104104

105+
if (isset($config['entry_point'])) {
106+
thrownewInvalidConfigurationException('The "security.firewall.'.$firewallName.'.guard.entry_point" option has no effect in the new authenticator system, configure "security.firewall.'.$firewallName.'.entry_point" instead.');
107+
}
108+
105109
$guardAuthenticatorIds =$config['authenticators'];
106110
foreach ($guardAuthenticatorIdsas$i =>$guardAuthenticatorId) {
107111
$container->setDefinition($authenticatorIds[] ='security.authenticator.guard.'.$firewallName.'.'.$i,newDefinition(GuardBridgeAuthenticator::class))
@@ -114,15 +118,6 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
114118
return$authenticatorIds;
115119
}
116120

117-
publicfunctionregisterEntryPoint(ContainerBuilder$container,string$firewallName,array$config): ?string
118-
{
119-
try {
120-
return$this->determineEntryPoint(null,$config);
121-
}catch (\LogicException$e) {
122-
thrownewInvalidConfigurationException(sprintf('Because you have multiple guard authenticators, you need to set the "entry_point" key to one of your authenticators (%s).',implode(',',$config['authenticators'])));
123-
}
124-
}
125-
126121
privatefunctiondetermineEntryPoint(?string$defaultEntryPointId,array$config):string
127122
{
128123
if ($defaultEntryPointId) {

‎src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/HttpBasicFactory.php‎

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*
2424
* @internal
2525
*/
26-
class HttpBasicFactoryimplements SecurityFactoryInterface, AuthenticatorFactoryInterface, EntryPointFactoryInterface
26+
class HttpBasicFactoryimplements SecurityFactoryInterface, AuthenticatorFactoryInterface
2727
{
2828
publicfunctioncreate(ContainerBuilder$container,string$id,array$config,string$userProvider, ?string$defaultEntryPoint)
2929
{
@@ -38,7 +38,11 @@ public function create(ContainerBuilder $container, string $id, array $config, s
3838
// entry point
3939
$entryPointId =$defaultEntryPoint;
4040
if (null ===$entryPointId) {
41-
$entryPointId =$this->registerEntryPoint($container,$id,$config);
41+
$entryPointId ='security.authentication.basic_entry_point.'.$id;
42+
$container
43+
->setDefinition($entryPointId,newChildDefinition('security.authentication.basic_entry_point'))
44+
->addArgument($config['realm'])
45+
;
4246
}
4347

4448
// listener
@@ -81,15 +85,4 @@ public function addConfiguration(NodeDefinition $node)
8185
->end()
8286
;
8387
}
84-
85-
publicfunctionregisterEntryPoint(ContainerBuilder$container,string$firewallName,array$config):string
86-
{
87-
$entryPointId ='security.authentication.basic_entry_point.'.$firewallName;
88-
$container
89-
->setDefinition($entryPointId,newChildDefinition('security.authentication.basic_entry_point'))
90-
->addArgument($config['realm'])
91-
;
92-
93-
return$entryPointId;
94-
}
9588
}

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

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -567,15 +567,13 @@ private function createAuthenticationListeners(ContainerBuilder $container, stri
567567

568568
$authenticators =$factory->createAuthenticator($container,$id,$firewall[$key],$userProvider);
569569
if (\is_array($authenticators)) {
570-
foreach ($authenticatorsas$i =>$authenticator) {
570+
foreach ($authenticatorsas$authenticator) {
571571
$authenticationProviders[] =$authenticator;
572+
$entryPoints[] =$authenticator;
572573
}
573574
}else {
574575
$authenticationProviders[] =$authenticators;
575-
}
576-
577-
if ($factoryinstanceof EntryPointFactoryInterface && ($entryPoint =$factory->registerEntryPoint($container,$id,$firewall[$key]))) {
578-
$entryPoints[$key] =$entryPoint;
576+
$entryPoints[$key] =$authenticators;
579577
}
580578
}else {
581579
[$provider,$listenerId,$defaultEntryPoint] =$factory->create($container,$id,$firewall[$key],$userProvider,$defaultEntryPoint);
@@ -596,16 +594,8 @@ private function createAuthenticationListeners(ContainerBuilder $container, stri
596594
}
597595
}
598596

599-
if ($entryPoints) {
600-
// we can be sure the authenticator system is enabled
601-
if (null !==$defaultEntryPoint) {
602-
$defaultEntryPoint =$entryPoints[$defaultEntryPoint] ??$defaultEntryPoint;
603-
}elseif (1 ===\count($entryPoints)) {
604-
$defaultEntryPoint =current($entryPoints);
605-
}else {
606-
thrownewInvalidConfigurationException(sprintf('Because you have multiple authenticators in firewall "%s", you need to set the "entry_point" key to one of your authenticators (%s) or a service ID implementing "%s". The "entry_point" determines what should happen (e.g. redirect to "/login") when an anonymous user tries to access a protected page.',$id,implode(',',$entryPoints), AuthenticationEntryPointInterface::class));
607-
}
608-
}
597+
// the actual entry point is configured by the RegisterEntryPointPass
598+
$container->setParameter('security.'.$id.'._indexed_authenticators',$entryPoints);
609599

610600
if (false ===$hasListeners && !$this->authenticatorManagerEnabled) {
611601
thrownewInvalidConfigurationException(sprintf('No authentication listener registered for firewall "%s".',$id));

‎src/Symfony/Bundle/SecurityBundle/SecurityBundle.php‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddSecurityVotersPass;
1616
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddSessionDomainConstraintPass;
1717
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterCsrfFeaturesPass;
18+
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterEntryPointPass;
1819
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterGlobalSecurityEventListenersPass;
1920
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterLdapLocatorPass;
2021
useSymfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterTokenUsageTrackingPass;
@@ -77,6 +78,7 @@ public function build(ContainerBuilder $container)
7778
$container->addCompilerPass(newRegisterCsrfFeaturesPass());
7879
$container->addCompilerPass(newRegisterTokenUsageTrackingPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION,200);
7980
$container->addCompilerPass(newRegisterLdapLocatorPass());
81+
$container->addCompilerPass(newRegisterEntryPointPass(), PassConfig::TYPE_BEFORE_REMOVING);
8082
// must be registered after RegisterListenersPass (in the FrameworkBundle)
8183
$container->addCompilerPass(newRegisterGlobalSecurityEventListenersPass(), PassConfig::TYPE_BEFORE_REMOVING, -200);
8284
// execute after ResolveChildDefinitionsPass optimization pass, to ensure class names are set

‎src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/Security/Factory/GuardAuthenticationFactoryTest.php‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ public function testAuthenticatorSystemCreate()
178178
$authenticators =$factory->createAuthenticator($container,$firewallName,$config,$userProviderId);
179179
$this->assertEquals('security.authenticator.guard.my_firewall.0',$authenticators[0]);
180180

181-
$entryPointId =$factory->registerEntryPoint($container,$firewallName,$config,null);
182-
$this->assertEquals('authenticator123',$entryPointId);
183-
184181
$authenticatorDefinition =$container->getDefinition('security.authenticator.guard.my_firewall.0');
185182
$this->assertEquals(GuardBridgeAuthenticator::class,$authenticatorDefinition->getClass());
186183
$this->assertEquals('authenticator123', (string)$authenticatorDefinition->getArgument(0));

‎src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php‎

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ public function testSwitchUserWithSeveralDefinedProvidersButNoFirewallRootProvid
438438
publicfunctiontestAuthenticatorManagerEnabledEntryPoint(array$firewall,$entryPointId)
439439
{
440440
$container =$this->getRawContainer();
441+
$container->register(AppCustomAuthenticator::class);
441442
$container->loadFromExtension('security', [
442443
'enable_authenticator_manager' =>true,
443444
'providers' => [
@@ -458,9 +459,9 @@ public function testAuthenticatorManagerEnabledEntryPoint(array $firewall, $entr
458459
publicfunctionprovideEntryPointFirewalls()
459460
{
460461
// only one entry point available
461-
yield [['http_basic' =>true],'security.authentication.basic_entry_point.main'];
462+
yield [['http_basic' =>true],'security.authenticator.http_basic.main'];
462463
// explicitly configured by authenticator key
463-
yield [['form_login' =>true,'http_basic' =>true,'entry_point' =>'form_login'],'security.authentication.form_entry_point.main'];
464+
yield [['form_login' =>true,'http_basic' =>true,'entry_point' =>'form_login'],'security.authenticator.form_login.main'];
464465
// explicitly configured another service
465466
yield [['form_login' =>true,'entry_point' => EntryPointStub::class], EntryPointStub::class];
466467
// no entry point required
@@ -469,14 +470,7 @@ public function provideEntryPointFirewalls()
469470
// only one guard authenticator entry point available
470471
yield [[
471472
'guard' => ['authenticators' => [AppCustomAuthenticator::class]],
472-
], AppCustomAuthenticator::class];
473-
// explicitly configured guard authenticator entry point
474-
yield [[
475-
'guard' => [
476-
'authenticators' => [AppCustomAuthenticator::class, NullAuthenticator::class],
477-
'entry_point' => NullAuthenticator::class,
478-
],
479-
], NullAuthenticator::class];
473+
],'security.authenticator.guard.main.0'];
480474
}
481475

482476
/**
@@ -507,12 +501,7 @@ public function provideEntryPointRequiredData()
507501
// more than one entry point available and not explicitly set
508502
yield [
509503
['http_basic' =>true,'form_login' =>true],
510-
'/^Because you have multiple authenticators in firewall "main", you need to set the "entry_point" key to one of your authenticators/',
511-
];
512-
// more than one guard entry point available and not explicitly set
513-
yield [
514-
['guard' => ['authenticators' => [AppCustomAuthenticator::class, NullAuthenticator::class]]],
515-
'/^Because you have multiple guard authenticators, you need to set the "entry_point" key to one of your authenticators/',
504+
'/Because you have multiple authenticators in firewall "main", you need to set the "entry_point" key to one of your authenticators \("form_login", "http_basic"\) or a service ID implementing/',
516505
];
517506
}
518507

@@ -537,6 +526,7 @@ public function testAlwaysAuthenticateBeforeGrantingCannotBeTrueWithAuthenticato
537526
publicfunctiontestConfigureCustomAuthenticator(array$firewall,array$expectedAuthenticators)
538527
{
539528
$container =$this->getRawContainer();
529+
$container->register(TestAuthenticator::class);
540530
$container->loadFromExtension('security', [
541531
'enable_authenticator_manager' =>true,
542532
'providers' => [

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp