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 e58bed4

Browse filesBrowse files
author
Robin Chalas
committed
Throw a meaningful exception when an undefined user provider is used inside a firewall
1 parent c708d02 commit e58bed4
Copy full SHA for e58bed4

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('User provider "%s" used for firewall "%s" does not exist.', $firewall['provider'], $id));
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('User provider "%s" used for listener "%s" on firewall "%s" does not exist.', $firewall[$key]['provider'], $key, $id));
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 User provider "undefined" used for firewall "main" does not exist.
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 User provider "undefined" used for listener "form_login" on firewall "main" does not exist.
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.