diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php index fc008a9fbd82c..23830660f5e63 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php @@ -43,12 +43,12 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider, // remember me services if (isset($config['token_provider'])) { $templateId = 'security.authentication.rememberme.services.persistent'; - $rememberMeServicesId = $templateId.'.'.$id; } else { $templateId = 'security.authentication.rememberme.services.simplehash'; - $rememberMeServicesId = $templateId.'.'.$id; } + $rememberMeServicesId = $templateId.'.'.$id; + if ($container->hasDefinition('security.logout_listener.'.$id)) { $container ->getDefinition('security.logout_listener.'.$id) diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index 5c88548bcff1d..020bb0f6d45b8 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -249,6 +249,12 @@ private function createFirewalls($config, ContainerBuilder $container) ->replaceArgument(2, new Reference($configId)) ; + if ($container->hasDefinition('security.authentication.rememberme.services.persistent.'.$name)) { + $context->replaceArgument(3, new Reference('security.authentication.rememberme.services.persistent.'.$name)); + } elseif ($container->hasDefinition('security.authentication.rememberme.services.simplehash.'.$name)) { + $context->replaceArgument(3, new Reference('security.authentication.rememberme.services.simplehash.'.$name)); + } + $map[$contextId] = $matcher; } $mapDef->replaceArgument(1, $map); diff --git a/src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml b/src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml index 8def320482486..5b08f64af83da 100644 --- a/src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml +++ b/src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml @@ -112,6 +112,7 @@ + diff --git a/src/Symfony/Bundle/SecurityBundle/Security/FirewallContext.php b/src/Symfony/Bundle/SecurityBundle/Security/FirewallContext.php index 9d00c121e5160..6075b9106a788 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security/FirewallContext.php +++ b/src/Symfony/Bundle/SecurityBundle/Security/FirewallContext.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Http\Firewall\ExceptionListener; +use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; /** * This is a wrapper around the actual firewall configuration which allows us @@ -24,8 +25,9 @@ class FirewallContext private $listeners; private $exceptionListener; private $config; + private $rememberMeServices; - public function __construct(array $listeners, ExceptionListener $exceptionListener = null, FirewallConfig $config = null) + public function __construct(array $listeners, ExceptionListener $exceptionListener = null, FirewallConfig $config = null, RememberMeServicesInterface $rememberMeServices = null) { if (null === $config) { @trigger_error(sprintf('"%s()" expects an instance of "%s" as third argument since version 3.2 and will trigger an error in 4.0 if not provided.', __METHOD__, FirewallConfig::class), E_USER_DEPRECATED); @@ -34,6 +36,7 @@ public function __construct(array $listeners, ExceptionListener $exceptionListen $this->listeners = $listeners; $this->exceptionListener = $exceptionListener; $this->config = $config; + $this->rememberMeServices = $rememberMeServices; } public function getConfig() @@ -45,4 +48,9 @@ public function getContext() { return array($this->listeners, $this->exceptionListener); } + + public function getRememberMeServices() + { + return $this->rememberMeServices; + } } diff --git a/src/Symfony/Bundle/SecurityBundle/Security/FirewallMap.php b/src/Symfony/Bundle/SecurityBundle/Security/FirewallMap.php index f833a63e65966..0e89593049077 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security/FirewallMap.php +++ b/src/Symfony/Bundle/SecurityBundle/Security/FirewallMap.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Http\FirewallMapInterface; +use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -63,6 +64,24 @@ public function getFirewallConfig(Request $request) return $context->getConfig(); } + /** + * Gets the remember me services for the given Request. + * + * @param Request $request + * + * @return RememberMeServicesInterface|null + */ + public function getRememberMeServices(Request $request) + { + $context = $this->getFirewallContext($request); + + if (null === $context) { + return; + } + + return $context->getRememberMeServices(); + } + private function getFirewallContext(Request $request) { if ($this->contexts->contains($request)) { diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Security/FirewallContextTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/Security/FirewallContextTest.php index 098e2c51f80dd..16afa0cfa599e 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/Security/FirewallContextTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/Security/FirewallContextTest.php @@ -15,6 +15,7 @@ use Symfony\Bundle\SecurityBundle\Security\FirewallContext; use Symfony\Component\Security\Http\Firewall\ExceptionListener; use Symfony\Component\Security\Http\Firewall\ListenerInterface; +use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; class FirewallContextTest extends \PHPUnit_Framework_TestCase { @@ -22,6 +23,10 @@ public function testGetters() { $config = new FirewallConfig('main', 'request_matcher', 'user_checker'); + $rememberMeServices = $this + ->getMockBuilder(RememberMeServicesInterface::class) + ->disableOriginalConstructor() + ->getMock(); $exceptionListener = $this ->getMockBuilder(ExceptionListener::class) ->disableOriginalConstructor() @@ -34,9 +39,10 @@ public function testGetters() ->getMock(), ); - $context = new FirewallContext($listeners, $exceptionListener, $config); + $context = new FirewallContext($listeners, $exceptionListener, $config, $rememberMeServices); - $this->assertEquals(array($listeners, $exceptionListener), $context->getContext()); - $this->assertEquals($config, $context->getConfig()); + $this->assertSame(array($listeners, $exceptionListener), $context->getContext()); + $this->assertSame($config, $context->getConfig()); + $this->assertSame($rememberMeServices, $context->getRememberMeServices()); } }