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());
}
}