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

Appearance settings

Commit 22c0028

Browse filesBrowse files
committed
feature #24114 [SecurityBundle] Throw a meaningful exception when an undefined user provider is used inside a firewall (chalasr)
This PR was merged into the 3.4 branch. Discussion ---------- [SecurityBundle] Throw a meaningful exception when an undefined user provider is used inside a firewall | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | n/a | License | MIT | Doc PR | n/a Before > The service "security.authentication.manager" has a dependency on a non-existent service "security.user.provider.concrete.undefined_provider". After > Invalid firewall "main": user provider "undefined_provider" not found. Commits ------- b884c66 Throw a meaningful exception when an undefined user provider is used inside a firewall
2 parents 7dfb5aa + b884c66 commit 22c0028
Copy full SHA for 22c0028

8 files changed

+124
-3
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php
+13-3Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
332332
// Provider id (take the first registered provider if none defined)
333333
if (isset($firewall['provider'])) {
334334
$defaultProvider = $this->getUserProviderId($firewall['provider']);
335+
if (!in_array($defaultProvider, $providerIds, true)) {
336+
throw new InvalidConfigurationException(sprintf('Invalid firewall "%s": user provider "%s" not found.', $id, $firewall['provider']));
337+
}
335338
} else {
336339
$defaultProvider = reset($providerIds);
337340
}
@@ -422,7 +425,7 @@ private function createFirewall(ContainerBuilder $container, $id, $firewall, &$a
422425
$configuredEntryPoint = isset($firewall['entry_point']) ? $firewall['entry_point'] : null;
423426

424427
// Authentication listeners
425-
list($authListeners, $defaultEntryPoint) = $this->createAuthenticationListeners($container, $id, $firewall, $authenticationProviders, $defaultProvider, $configuredEntryPoint);
428+
list($authListeners, $defaultEntryPoint) = $this->createAuthenticationListeners($container, $id, $firewall, $authenticationProviders, $defaultProvider, $providerIds, $configuredEntryPoint);
426429

427430
$config->replaceArgument(7, $configuredEntryPoint ?: $defaultEntryPoint);
428431

@@ -477,7 +480,7 @@ private function createContextListener($container, $contextKey)
477480
return $this->contextListeners[$contextKey] = $listenerId;
478481
}
479482

480-
private function createAuthenticationListeners($container, $id, $firewall, &$authenticationProviders, $defaultProvider, $defaultEntryPoint)
483+
private function createAuthenticationListeners($container, $id, $firewall, &$authenticationProviders, $defaultProvider, array $providerIds, $defaultEntryPoint)
481484
{
482485
$listeners = array();
483486
$hasListeners = false;
@@ -487,7 +490,14 @@ private function createAuthenticationListeners($container, $id, $firewall, &$aut
487490
$key = str_replace('-', '_', $factory->getKey());
488491

489492
if (isset($firewall[$key])) {
490-
$userProvider = isset($firewall[$key]['provider']) ? $this->getUserProviderId($firewall[$key]['provider']) : $defaultProvider;
493+
if (isset($firewall[$key]['provider'])) {
494+
if (!in_array($firewall[$key]['provider'], $providerIds, true)) {
495+
throw new InvalidConfigurationException(sprintf('Invalid firewall "%s": user provider "%s" not found.', $id, $firewall[$key]['provider']));
496+
}
497+
$userProvider = $this->getUserProviderId($firewall[$key]['provider']);
498+
} else {
499+
$userProvider = $defaultProvider;
500+
}
491501

492502
list($provider, $listenerId, $defaultEntryPoint) = $factory->create($container, $id, $firewall[$key], $userProvider, $defaultEntryPoint);
493503

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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/CompleteConfigurationTest.php
+18Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,24 @@ public function testAccessDecisionManagerServiceAndStrategyCannotBeUsedAtTheSame
387387
$container = $this->getContainer('access_decision_manager_service_and_strategy');
388388
}
389389

390+
/**
391+
* @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
392+
* @expectedExceptionMessage Invalid firewall "main": user provider "undefined" not found.
393+
*/
394+
public function testFirewallUndefinedUserProvider()
395+
{
396+
$this->getContainer('firewall_undefined_provider');
397+
}
398+
399+
/**
400+
* @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
401+
* @expectedExceptionMessage Invalid firewall "main": user provider "undefined" not found.
402+
*/
403+
public function testFirewallListenerUndefinedProvider()
404+
{
405+
$this->getContainer('listener_undefined_provider');
406+
}
407+
390408
protected function getContainer($file)
391409
{
392410
$file = $file.'.'.$this->getFileExtension();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
$container->loadFromExtension('security', array(
4+
'providers' => array(
5+
'default' => array(
6+
'memory' => array(
7+
'users' => array('foo' => array('password' => 'foo', 'roles' => 'ROLE_USER')),
8+
),
9+
),
10+
),
11+
'firewalls' => array(
12+
'main' => array(
13+
'provider' => 'undefined',
14+
'form_login' => true,
15+
),
16+
),
17+
));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
$container->loadFromExtension('security', array(
4+
'providers' => array(
5+
'default' => array(
6+
'memory' => array(
7+
'users' => array('foo' => array('password' => 'foo', 'roles' => 'ROLE_USER')),
8+
),
9+
),
10+
),
11+
'firewalls' => array(
12+
'main' => array(
13+
'form_login' => array('provider' => 'undefined'),
14+
),
15+
),
16+
));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:sec="http://symfony.com/schema/dic/security"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
7+
8+
<sec:config>
9+
<sec:providers>
10+
<sec:provider name="default" id="foo" />
11+
</sec:providers>
12+
13+
<sec:firewalls>
14+
<sec:firewall name="main" provider="undefined">
15+
<sec:form_login />
16+
</sec:firewall>
17+
</sec:firewalls>
18+
</sec:config>
19+
20+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:sec="http://symfony.com/schema/dic/security"
6+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
7+
8+
<sec:config>
9+
<sec:providers>
10+
<sec:provider name="default" id="foo" />
11+
</sec:providers>
12+
13+
<sec:firewalls>
14+
<sec:firewall name="main">
15+
<sec:form_login provider="undefined" />
16+
</sec:firewall>
17+
</sec:firewalls>
18+
</sec:config>
19+
20+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
security:
2+
providers:
3+
default:
4+
memory:
5+
users: { foo: { password: foo, roles: ROLE_USER } }
6+
7+
firewalls:
8+
main:
9+
provider: undefined
10+
form_login: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
security:
2+
providers:
3+
default:
4+
memory:
5+
users: { foo: { password: foo, roles: ROLE_USER } }
6+
7+
firewalls:
8+
main:
9+
form_login:
10+
provider: undefined

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.