* * 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\Reference; /** * RemoteUserFactory creates services for REMOTE_USER based authentication. * * @author Fabien Potencier * @author Maxime Douailin * * @internal */ class RemoteUserFactory implements SecurityFactoryInterface, AuthenticatorFactoryInterface { public function create(ContainerBuilder $container, string $id, array $config, string $userProvider, ?string $defaultEntryPoint) { $providerId = 'security.authentication.provider.pre_authenticated.'.$id; $container ->setDefinition($providerId, new ChildDefinition('security.authentication.provider.pre_authenticated')) ->replaceArgument(0, new Reference($userProvider)) ->replaceArgument(1, new Reference('security.user_checker.'.$id)) ->addArgument($id) ; $listenerId = 'security.authentication.listener.remote_user.'.$id; $listener = $container->setDefinition($listenerId, new ChildDefinition('security.authentication.listener.remote_user')); $listener->replaceArgument(2, $id); $listener->replaceArgument(3, $config['user']); $listener->addMethodCall('setSessionAuthenticationStrategy', [new Reference('security.authentication.session_strategy.'.$id)]); return [$providerId, $listenerId, $defaultEntryPoint]; } public function createAuthenticator(ContainerBuilder $container, string $firewallName, array $config, string $userProviderId) { $authenticatorId = 'security.authenticator.remote_user.'.$firewallName; $container ->setDefinition($authenticatorId, new ChildDefinition('security.authenticator.remote_user')) ->replaceArgument(0, new Reference($userProviderId)) ->replaceArgument(2, $firewallName) ->replaceArgument(3, $config['user']) ; return $authenticatorId; } public function getPosition() { return 'pre_auth'; } public function getKey() { return 'remote-user'; } public function addConfiguration(NodeDefinition $node) { $node ->children() ->scalarNode('provider')->end() ->scalarNode('user')->defaultValue('REMOTE_USER')->end() ->end() ; } }