Enabled remember me for the GuardManagerListener

This commit is contained in:
Wouter de Jong 2020-01-26 21:36:07 +01:00
parent 873b949cf9
commit b923e4c4f6
3 changed files with 22 additions and 11 deletions

View File

@ -418,6 +418,19 @@ class SecurityExtension extends Extension implements PrependExtensionInterface
// Determine default entry point
$configuredEntryPoint = isset($firewall['entry_point']) ? $firewall['entry_point'] : null;
if ($this->guardAuthenticationManagerEnabled) {
// guard authentication manager listener (must be before calling createAuthenticationListeners() to inject remember me services)
$container
->setDefinition('security.firewall.guard.'.$id, new ChildDefinition('security.firewall.guard'))
->replaceArgument(2, new Reference('security.firewall.guard.'.$id.'.locator'))
->replaceArgument(3, $id)
->addTag('kernel.event_listener', ['event' => KernelEvents::REQUEST])
->addTag('security.remember_me_aware', ['id' => $id, 'provider' => 'none'])
;
$listeners[] = new Reference('security.firewall.guard.'.$id);
}
// Authentication listeners
$firewallAuthenticationProviders = [];
list($authListeners, $defaultEntryPoint) = $this->createAuthenticationListeners($container, $id, $firewall, $firewallAuthenticationProviders, $defaultProvider, $providerIds, $configuredEntryPoint, $contextListenerId);
@ -425,7 +438,7 @@ class SecurityExtension extends Extension implements PrependExtensionInterface
$authenticationProviders = array_merge($authenticationProviders, $firewallAuthenticationProviders);
if ($this->guardAuthenticationManagerEnabled) {
// guard authentication manager listener
// add authentication providers for this firewall to the GuardManagerListener (if guard is enabled)
$container
->setDefinition('security.firewall.guard.'.$id.'.locator', new ChildDefinition('security.firewall.guard.locator'))
->setArguments([array_map(function ($id) {
@ -434,13 +447,9 @@ class SecurityExtension extends Extension implements PrependExtensionInterface
->addTag('container.service_locator')
;
$container
->setDefinition('security.firewall.guard.'.$id, new ChildDefinition('security.firewall.guard'))
->getDefinition('security.firewall.guard.'.$id)
->replaceArgument(2, new Reference('security.firewall.guard.'.$id.'.locator'))
->replaceArgument(3, $id)
->addTag('kernel.event_listener', ['event' => KernelEvents::REQUEST])
;
$listeners[] = new Reference('security.firewall.guard.'.$id);
}
$config->replaceArgument(7, $configuredEntryPoint ?: $defaultEntryPoint);

View File

@ -150,11 +150,6 @@ trait GuardAuthenticatorListenerTrait
throw new \UnexpectedValueException('Invalid guard authenticator passed to '.__METHOD__.'. Expected AuthenticatorInterface of either Security Core or Security Guard.');
}
// @todo implement remember me functionality
if (!isset($this->rememberMeServices)) {
return;
}
if (null === $this->rememberMeServices) {
if (null !== $this->logger) {
$this->logger->debug('Remember me skipped: it is not configured for the firewall.', ['authenticator' => \get_class($guardAuthenticator)]);

View File

@ -17,6 +17,7 @@ use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterfac
use Symfony\Component\Security\Core\Authentication\Authenticator\AuthenticatorInterface;
use Symfony\Component\Security\Guard\Firewall\GuardAuthenticatorListenerTrait;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
/**
* @author Wouter de Jong <wouter@wouterj.nl>
@ -34,6 +35,7 @@ class GuardManagerListener
private $guardAuthenticators;
protected $providerKey;
protected $logger;
private $rememberMeServices;
/**
* @param AuthenticatorInterface[] $guardAuthenticators
@ -58,6 +60,11 @@ class GuardManagerListener
$this->executeGuardAuthenticators($guardAuthenticators, $requestEvent);
}
public function setRememberMeServices(RememberMeServicesInterface $rememberMeServices)
{
$this->rememberMeServices = $rememberMeServices;
}
protected function getGuardKey(string $key): string
{
// Guard authenticators in the GuardManagerListener are already indexed