From 0da2761c150d9cac39ed9dd5b0ab57fdb5fc80de Mon Sep 17 00:00:00 2001 From: Wouter J Date: Sun, 8 Sep 2019 15:40:29 +0200 Subject: [PATCH] Move Anonymous config to a SecurityFactory --- .../DependencyInjection/MainConfiguration.php | 6 -- .../Security/Factory/AnonymousFactory.php | 63 +++++++++++++++++++ .../DependencyInjection/SecurityExtension.php | 31 +-------- .../Bundle/SecurityBundle/SecurityBundle.php | 2 + 4 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/AnonymousFactory.php diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php index 1e1e97ccb5..20c6a25984 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php @@ -255,12 +255,6 @@ class MainConfiguration implements ConfigurationInterface ->end() ->end() ->end() - ->arrayNode('anonymous') - ->canBeUnset() - ->children() - ->scalarNode('secret')->defaultNull()->end() - ->end() - ->end() ->arrayNode('switch_user') ->canBeUnset() ->children() diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/AnonymousFactory.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/AnonymousFactory.php new file mode 100644 index 0000000000..dc8e4a9ba3 --- /dev/null +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/AnonymousFactory.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory; + +use Symfony\Component\Config\Definition\Builder\NodeDefinition; +use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Parameter; + +/** + * @author Wouter de Jong + */ +class AnonymousFactory implements SecurityFactoryInterface +{ + public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint) + { + if (null === $config['secret']) { + $firewall['anonymous']['secret'] = new Parameter('container.build_hash'); + } + + $listenerId = 'security.authentication.listener.anonymous.'.$id; + $container + ->setDefinition($listenerId, new ChildDefinition('security.authentication.listener.anonymous')) + ->replaceArgument(1, $firewall['anonymous']['secret']) + ; + + $providerId = 'security.authentication.provider.anonymous.'.$id; + $container + ->setDefinition($providerId, new ChildDefinition('security.authentication.provider.anonymous')) + ->replaceArgument(0, $firewall['anonymous']['secret']) + ; + + return [$providerId, $listenerId, $defaultEntryPoint]; + } + + public function getPosition() + { + return 'anonymous'; + } + + public function getKey() + { + return 'anonymous'; + } + + public function addConfiguration(NodeDefinition $builder) + { + $builder + ->children() + ->scalarNode('secret')->defaultNull()->end() + ->end() + ; + } +} diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index 2a38636ac8..b828dfd67a 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -25,7 +25,6 @@ use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; -use Symfony\Component\DependencyInjection\Parameter; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; @@ -48,7 +47,7 @@ class SecurityExtension extends Extension implements PrependExtensionInterface private $requestMatchers = []; private $expressions = []; private $contextListeners = []; - private $listenerPositions = ['pre_auth', 'form', 'http', 'remember_me']; + private $listenerPositions = ['pre_auth', 'form', 'http', 'remember_me', 'anonymous']; private $factories = []; private $userProviderFactories = []; private $statelessFirewallKeys = []; @@ -429,10 +428,6 @@ class SecurityExtension extends Extension implements PrependExtensionInterface } } - if (isset($firewall['anonymous'])) { - $listenerKeys[] = 'anonymous'; - } - $config->replaceArgument(10, $listenerKeys); $config->replaceArgument(11, isset($firewall['switch_user']) ? $firewall['switch_user'] : null); @@ -488,30 +483,6 @@ class SecurityExtension extends Extension implements PrependExtensionInterface } } - // Anonymous - if (isset($firewall['anonymous'])) { - if (null === $firewall['anonymous']['secret']) { - $firewall['anonymous']['secret'] = new Parameter('container.build_hash'); - } - - $listenerId = 'security.authentication.listener.anonymous.'.$id; - $container - ->setDefinition($listenerId, new ChildDefinition('security.authentication.listener.anonymous')) - ->replaceArgument(1, $firewall['anonymous']['secret']) - ; - - $listeners[] = new Reference($listenerId); - - $providerId = 'security.authentication.provider.anonymous.'.$id; - $container - ->setDefinition($providerId, new ChildDefinition('security.authentication.provider.anonymous')) - ->replaceArgument(0, $firewall['anonymous']['secret']) - ; - - $authenticationProviders[] = $providerId; - $hasListeners = true; - } - if (false === $hasListeners) { throw new InvalidConfigurationException(sprintf('No authentication listener registered for firewall "%s".', $id)); } diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php b/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php index e5035d765d..61e2880615 100644 --- a/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php +++ b/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php @@ -15,6 +15,7 @@ use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddExpressionLang use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddSecurityVotersPass; use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\AddSessionDomainConstraintPass; use Symfony\Bundle\SecurityBundle\DependencyInjection\Compiler\RegisterCsrfTokenClearingLogoutHandlerPass; +use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AnonymousFactory; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\FormLoginFactory; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\FormLoginLdapFactory; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\GuardAuthenticationFactory; @@ -57,6 +58,7 @@ class SecurityBundle extends Bundle $extension->addSecurityListenerFactory(new SimplePreAuthenticationFactory(false)); $extension->addSecurityListenerFactory(new SimpleFormFactory(false)); $extension->addSecurityListenerFactory(new GuardAuthenticationFactory()); + $extension->addSecurityListenerFactory(new AnonymousFactory()); $extension->addUserProviderFactory(new InMemoryFactory()); $extension->addUserProviderFactory(new LdapFactory());