Skip to content

Commit f857d7d

Browse files
committed
feature #10793 [Security] Allow exception bubbling in RememberMeListener (lstrojny)
This PR was merged into the 2.6-dev branch. Discussion ---------- [Security] Allow exception bubbling in RememberMeListener - Allow optional exception bubbling so that the exception listener has a chance to handle those exceptions #### While at it - Test for dispatching the InteractiveLogin event - Smaller cleanups in the test | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | ye | Fixed tickets | n.A. | License | MIT | Doc PR | n.A. Commits ------- fcb7f74 Allow exception bubbling in RememberMeListener
2 parents 4f305f9 + bd3a40e commit f857d7d

File tree

9 files changed

+70
-1
lines changed

9 files changed

+70
-1
lines changed

DependencyInjection/Security/Factory/RememberMeFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
102102
$listenerId = 'security.authentication.listener.rememberme.'.$id;
103103
$listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.rememberme'));
104104
$listener->replaceArgument(1, new Reference($rememberMeServicesId));
105+
$listener->replaceArgument(4, $config['catch_exceptions']);
105106

106107
return array($authProviderId, $listenerId, $defaultEntryPoint);
107108
}
@@ -130,6 +131,7 @@ public function addConfiguration(NodeDefinition $node)
130131
->end()
131132
->prototype('scalar')->end()
132133
->end()
134+
->scalarNode('catch_exceptions')->defaultTrue()->end()
133135
;
134136

135137
foreach ($this->options as $name => $value) {

Resources/config/security_rememberme.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
<argument type="service" id="security.authentication.manager" />
2525
<argument type="service" id="logger" on-invalid="null" />
2626
<argument type="service" id="event_dispatcher" on-invalid="null"/>
27+
<argument /> <!-- Catch exception flag set in RememberMeFactory -->
2728
</service>
2829

2930
<service id="security.authentication.provider.rememberme" class="%security.authentication.provider.rememberme.class%" abstract="true" public="false">
3031
<argument type="service" id="security.user_checker" />
3132
</service>
3233

33-
<service id="security.rememberme.token.provider.in_memory" class="%security.rememberme.token.provider.in_memory.class%" public="false"></service>
34+
<service id="security.rememberme.token.provider.in_memory" class="%security.rememberme.token.provider.in_memory.class%" public="false"/>
3435

3536
<service id="security.authentication.rememberme.services.abstract" abstract="true" public="false">
3637
<tag name="monolog.logger" channel="security" />

Tests/DependencyInjection/CompleteConfigurationTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public function testFirewalls()
8282
'security.authentication.listener.form.secure',
8383
'security.authentication.listener.basic.secure',
8484
'security.authentication.listener.digest.secure',
85+
'security.authentication.listener.rememberme.secure',
8586
'security.authentication.listener.anonymous.secure',
8687
'security.access_listener',
8788
'security.authentication.switchuser_listener.secure',
@@ -219,6 +220,20 @@ public function testCustomAclProvider()
219220
$this->assertEquals('foo', (string) $container->getAlias('security.acl.provider'));
220221
}
221222

223+
public function testRememberMeThrowExceptionsDefault()
224+
{
225+
$container = $this->getContainer('container1');
226+
$this->assertTrue($container->getDefinition('security.authentication.listener.rememberme.secure')->getArgument(4));
227+
}
228+
229+
public function testRememberMeThrowExceptions()
230+
{
231+
$container = $this->getContainer('remember_me_options');
232+
$service = $container->getDefinition('security.authentication.listener.rememberme.main');
233+
$this->assertEquals('security.authentication.rememberme.services.persistent.main', $service->getArgument(1));
234+
$this->assertFalse($service->getArgument(4));
235+
}
236+
222237
protected function getContainer($file)
223238
{
224239
$container = new ContainerBuilder();

Tests/DependencyInjection/Fixtures/php/container1.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
'switch_user' => true,
7171
'x509' => true,
7272
'logout' => true,
73+
'remember_me' => array('key' => 'TheKey')
7374
),
7475
'host' => array(
7576
'pattern' => '/test',
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
$container->loadFromExtension('security', array(
3+
'providers' => array(
4+
'default' => array('id' => 'foo'),
5+
),
6+
7+
'firewalls' => array(
8+
'main' => array(
9+
'form_login' => true,
10+
'remember_me' => array(
11+
'key' => 'TheyKey',
12+
'catch_exceptions' => false,
13+
'token_provider' => 'token_provider_id',
14+
)
15+
)
16+
),
17+
));

Tests/DependencyInjection/Fixtures/xml/container1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<switch-user />
5656
<x509 />
5757
<logout />
58+
<remember-me key="TheyKey"/>
5859
</firewall>
5960

6061
<firewall name="host" pattern="/test" host="foo\.example\.org" methods="GET,POST">
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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:default id="foo"/>
11+
</sec:providers>
12+
<sec:firewall name="main">
13+
<sec:form-login/>
14+
<sec:remember-me key="TheKey" catch-exceptions="false" token-provider="token_provider_id" />
15+
</sec:firewall>
16+
</sec:config>
17+
18+
</container>

Tests/DependencyInjection/Fixtures/yml/container1.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ security:
5353
switch_user: true
5454
x509: true
5555
logout: true
56+
remember_me:
57+
key: TheKey
5658
host:
5759
pattern: /test
5860
host: foo\.example\.org
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
security:
2+
providers:
3+
default:
4+
id: foo
5+
6+
firewalls:
7+
main:
8+
form_login: true
9+
remember_me:
10+
key: TheKey
11+
catch_exceptions: false
12+
token_provider: token_provider_id

0 commit comments

Comments
 (0)