Skip to content

Commit e3efa2f

Browse files
bug #25045 [SecurityBundle] Don't trigger auto-picking notice if provider is set per listener (chalasr)
This PR was merged into the 3.4 branch. Discussion ---------- [SecurityBundle] Don't trigger auto-picking notice if provider is set per listener | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #24980 | License | MIT | Doc PR | n/a Commits ------- 19e891a [SecurityBundle] Don't trigger auto-picking notice if provider is set per listener
2 parents 1b6597d + 19e891a commit e3efa2f

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

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

+15-8
Original file line numberDiff line numberDiff line change
@@ -346,17 +346,14 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
346346
$config->replaceArgument(4, $firewall['stateless']);
347347

348348
// Provider id (take the first registered provider if none defined)
349+
$defaultProvider = null;
349350
if (isset($firewall['provider'])) {
350351
if (!isset($providerIds[$normalizedName = str_replace('-', '_', $firewall['provider'])])) {
351352
throw new InvalidConfigurationException(sprintf('Invalid firewall "%s": user provider "%s" not found.', $id, $firewall['provider']));
352353
}
353354
$defaultProvider = $providerIds[$normalizedName];
354-
} else {
355+
} elseif (1 === count($providerIds)) {
355356
$defaultProvider = reset($providerIds);
356-
357-
if (count($providerIds) > 1) {
358-
@trigger_error(sprintf('Firewall "%s" has no "provider" set but multiple providers exist. Using the first configured provider (%s) is deprecated since 3.4 and will throw an exception in 4.0, set the "provider" key on the firewall instead.', $id, key($providerIds)), E_USER_DEPRECATED);
359-
}
360357
}
361358

362359
$config->replaceArgument(5, $defaultProvider);
@@ -500,7 +497,7 @@ private function createContextListener($container, $contextKey)
500497
return $this->contextListeners[$contextKey] = $listenerId;
501498
}
502499

503-
private function createAuthenticationListeners($container, $id, $firewall, &$authenticationProviders, $defaultProvider, array $providerIds, $defaultEntryPoint)
500+
private function createAuthenticationListeners($container, $id, $firewall, &$authenticationProviders, $defaultProvider = null, array $providerIds, $defaultEntryPoint)
504501
{
505502
$listeners = array();
506503
$hasListeners = false;
@@ -516,7 +513,7 @@ private function createAuthenticationListeners($container, $id, $firewall, &$aut
516513
}
517514
$userProvider = $providerIds[$normalizedName];
518515
} else {
519-
$userProvider = $defaultProvider;
516+
$userProvider = $defaultProvider ?: $this->getFirstProvider($id, $key, $providerIds);
520517
}
521518

522519
list($provider, $listenerId, $defaultEntryPoint) = $factory->create($container, $id, $firewall[$key], $userProvider, $defaultEntryPoint);
@@ -699,7 +696,7 @@ private function createExceptionListener($container, $config, $id, $defaultEntry
699696

700697
private function createSwitchUserListener($container, $id, $config, $defaultProvider, $stateless)
701698
{
702-
$userProvider = isset($config['provider']) ? $this->getUserProviderId($config['provider']) : $defaultProvider;
699+
$userProvider = isset($config['provider']) ? $this->getUserProviderId($config['provider']) : ($defaultProvider ?: $this->getFirstProvider($id, 'switch_user', $providerIds));
703700

704701
// in 4.0, ignore the `switch_user.stateless` key if $stateless is `true`
705702
if ($stateless && false === $config['stateless']) {
@@ -803,4 +800,14 @@ private function getExpressionLanguage()
803800

804801
return $this->expressionLanguage;
805802
}
803+
804+
/**
805+
* @deprecated since version 3.4, to be removed in 4.0
806+
*/
807+
private function getFirstProvider($firewallName, $listenerName, array $providerIds)
808+
{
809+
@trigger_error(sprintf('Listener "%s" on firewall "%s" has no "provider" set but multiple providers exist. Using the first configured provider (%s) is deprecated since 3.4 and will throw an exception in 4.0, set the "provider" key on the firewall instead.', $listenerName, $firewallName, $first = array_keys($providerIds)[0]), E_USER_DEPRECATED);
810+
811+
return $providerIds[$first];
812+
}
806813
}

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

+22-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public function testSwitchUserNotStatelessOnStatelessFirewall()
176176

177177
/**
178178
* @group legacy
179-
* @expectedDeprecation Firewall "default" has no "provider" set but multiple providers exist. Using the first configured provider (first) is deprecated since 3.4 and will throw an exception in 4.0, set the "provider" key on the firewall instead.
179+
* @expectedDeprecation Listener "http_basic" on firewall "default" has no "provider" set but multiple providers exist. Using the first configured provider (first) is deprecated since 3.4 and will throw an exception in 4.0, set the "provider" key on the firewall instead.
180180
*/
181181
public function testDeprecationForAmbiguousProvider()
182182
{
@@ -199,6 +199,27 @@ public function testDeprecationForAmbiguousProvider()
199199
$container->compile();
200200
}
201201

202+
public function testPerListenerProvider()
203+
{
204+
$container = $this->getRawContainer();
205+
$container->loadFromExtension('security', array(
206+
'providers' => array(
207+
'first' => array('id' => 'foo'),
208+
'second' => array('id' => 'bar'),
209+
),
210+
211+
'firewalls' => array(
212+
'default' => array(
213+
'http_basic' => array('provider' => 'second'),
214+
'logout_on_user_change' => true,
215+
),
216+
),
217+
));
218+
219+
$container->compile();
220+
$this->addToAssertionCount(1);
221+
}
222+
202223
protected function getRawContainer()
203224
{
204225
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)