Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b884c66

Browse files
committed
Throw a meaningful exception when an undefined user provider is used inside a firewall
1 parent c708d02 commit b884c66

8 files changed

+124
-3
lines changed

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

Lines 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

Lines 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)