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 // Determine default entry point
$configuredEntryPoint = isset($firewall['entry_point']) ? $firewall['entry_point'] : null; $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 // Authentication listeners
$firewallAuthenticationProviders = []; $firewallAuthenticationProviders = [];
list($authListeners, $defaultEntryPoint) = $this->createAuthenticationListeners($container, $id, $firewall, $firewallAuthenticationProviders, $defaultProvider, $providerIds, $configuredEntryPoint, $contextListenerId); 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); $authenticationProviders = array_merge($authenticationProviders, $firewallAuthenticationProviders);
if ($this->guardAuthenticationManagerEnabled) { if ($this->guardAuthenticationManagerEnabled) {
// guard authentication manager listener // add authentication providers for this firewall to the GuardManagerListener (if guard is enabled)
$container $container
->setDefinition('security.firewall.guard.'.$id.'.locator', new ChildDefinition('security.firewall.guard.locator')) ->setDefinition('security.firewall.guard.'.$id.'.locator', new ChildDefinition('security.firewall.guard.locator'))
->setArguments([array_map(function ($id) { ->setArguments([array_map(function ($id) {
@ -434,13 +447,9 @@ class SecurityExtension extends Extension implements PrependExtensionInterface
->addTag('container.service_locator') ->addTag('container.service_locator')
; ;
$container $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(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); $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.'); 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->rememberMeServices) {
if (null !== $this->logger) { if (null !== $this->logger) {
$this->logger->debug('Remember me skipped: it is not configured for the firewall.', ['authenticator' => \get_class($guardAuthenticator)]); $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\Core\Authentication\Authenticator\AuthenticatorInterface;
use Symfony\Component\Security\Guard\Firewall\GuardAuthenticatorListenerTrait; use Symfony\Component\Security\Guard\Firewall\GuardAuthenticatorListenerTrait;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler; use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
/** /**
* @author Wouter de Jong <wouter@wouterj.nl> * @author Wouter de Jong <wouter@wouterj.nl>
@ -34,6 +35,7 @@ class GuardManagerListener
private $guardAuthenticators; private $guardAuthenticators;
protected $providerKey; protected $providerKey;
protected $logger; protected $logger;
private $rememberMeServices;
/** /**
* @param AuthenticatorInterface[] $guardAuthenticators * @param AuthenticatorInterface[] $guardAuthenticators
@ -58,6 +60,11 @@ class GuardManagerListener
$this->executeGuardAuthenticators($guardAuthenticators, $requestEvent); $this->executeGuardAuthenticators($guardAuthenticators, $requestEvent);
} }
public function setRememberMeServices(RememberMeServicesInterface $rememberMeServices)
{
$this->rememberMeServices = $rememberMeServices;
}
protected function getGuardKey(string $key): string protected function getGuardKey(string $key): string
{ {
// Guard authenticators in the GuardManagerListener are already indexed // Guard authenticators in the GuardManagerListener are already indexed