diff --git a/composer.json b/composer.json index a6cc9c4..24312b7 100644 --- a/composer.json +++ b/composer.json @@ -19,16 +19,16 @@ } }, "require": { - "php": ">=5.6", - "symfony/framework-bundle": "~2.7|~3.0|~4.0", - "symfony/security-bundle": "~2.7|~3.0|~4.0", - "lightsaml/symfony-bridge": "~1.3" + "php": ">=7.2.5", + "symfony/framework-bundle": "~5.0|~6.0", + "symfony/security-bundle": "~5.0|~6.0", + "lightsaml/symfony-bridge": "dev-symfony6" }, "require-dev": { - "phpunit/phpunit": "^5.7", - "sebastian/comparator": "^1.2.4|~2.0|~3.0", - "symfony/symfony": "~2.7|~3.0|~4.0", - "symfony/monolog-bundle": "~2.7|~3.0|~4.0" + "phpunit/phpunit": "~8.4|~9.5", + "sebastian/comparator": "^4.0", + "symfony/symfony": "~5.0|~6.0", + "symfony/monolog-bundle": "~3.0" }, "config": { "bin-dir": "bin" diff --git a/src/LightSaml/SpBundle/Controller/DefaultController.php b/src/LightSaml/SpBundle/Controller/DefaultController.php index b6d69a0..a3e4c23 100644 --- a/src/LightSaml/SpBundle/Controller/DefaultController.php +++ b/src/LightSaml/SpBundle/Controller/DefaultController.php @@ -11,14 +11,41 @@ namespace LightSaml\SpBundle\Controller; -use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use LightSaml\SymfonyBridgeBundle\Bridge\Container\BuildContainer; +use LightSaml\Builder\Profile\WebBrowserSso\Sp\SsoSpSendAuthnRequestProfileBuilderFactory; +use LightSaml\Builder\Profile\Metadata\MetadataProfileBuilder; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; -class DefaultController extends Controller +class DefaultController extends AbstractController { + /** + * @var BuildContainer $buildContainer + */ + protected BuildContainer $buildContainer; + /** + * @var SsoSpSendAuthnRequestProfileBuilderFactory $ssoSpSendAuthnRequestProfileBuilderFactory + */ + protected SsoSpSendAuthnRequestProfileBuilderFactory $ssoSpSendAuthnRequestProfileBuilderFactory; + /** + * @var MetadataProfileBuilder $metadataProfileBuilder + */ + protected MetadataProfileBuilder $metadataProfileBuilder; + /** + * @var string $samlSpDiscoveryRoute + */ + protected string $samlSpDiscoveryRoute; + + public function __construct(BuildContainer $buildContainer, SsoSpSendAuthnRequestProfileBuilderFactory $ssoSpSendAuthnRequestProfileBuilderFactory, MetadataProfileBuilder $metadataProfileBuilder, string $samlSpDiscoveryRoute) + { + $this->buildContainer = $buildContainer; + $this->ssoSpSendAuthnRequestProfileBuilderFactory = $ssoSpSendAuthnRequestProfileBuilderFactory; + $this->metadataProfileBuilder = $metadataProfileBuilder; + $this->samlSpDiscoveryRoute = $samlSpDiscoveryRoute; + } public function metadataAction() { - $profile = $this->get('ligthsaml.profile.metadata'); + $profile = $this->metadataProfileBuilder; $context = $profile->buildContext(); $action = $profile->buildAction(); @@ -29,7 +56,7 @@ public function metadataAction() public function discoveryAction() { - $parties = $this->get('lightsaml.container.build')->getPartyContainer()->getIdpEntityDescriptorStore()->all(); + $parties = $this->buildContainer->getPartyContainer()->getIdpEntityDescriptorStore()->all(); if (1 == count($parties)) { return $this->redirect($this->generateUrl('lightsaml_sp.login', ['idp' => $parties[0]->getEntityID()])); @@ -44,10 +71,10 @@ public function loginAction(Request $request) { $idpEntityId = $request->get('idp'); if (null === $idpEntityId) { - return $this->redirect($this->generateUrl($this->container->getParameter('lightsaml_sp.route.discovery'))); + return $this->redirect($this->generateUrl($this->samlSpDiscoveryRoute)); } - $profile = $this->get('ligthsaml.profile.login_factory')->get($idpEntityId); + $profile = $this->ssoSpSendAuthnRequestProfileBuilderFactory->get($idpEntityId); $context = $profile->buildContext(); $action = $profile->buildAction(); @@ -58,7 +85,7 @@ public function loginAction(Request $request) public function sessionsAction() { - $ssoState = $this->get('lightsaml.container.build')->getStoreContainer()->getSsoStateStore()->get(); + $ssoState = $this->buildContainer->getStoreContainer()->getSsoStateStore()->get(); return $this->render('@LightSamlSp/sessions.html.twig', [ 'sessions' => $ssoState->getSsoSessions(), diff --git a/src/LightSaml/SpBundle/DependencyInjection/Configuration.php b/src/LightSaml/SpBundle/DependencyInjection/Configuration.php index 192625b..d1a0f54 100644 --- a/src/LightSaml/SpBundle/DependencyInjection/Configuration.php +++ b/src/LightSaml/SpBundle/DependencyInjection/Configuration.php @@ -25,8 +25,8 @@ class Configuration implements ConfigurationInterface */ public function getConfigTreeBuilder() { - $treeBuilder = new TreeBuilder(); - $root = $treeBuilder->root('light_saml_sp'); + $treeBuilder = new TreeBuilder('light_saml_sp'); + $root = $treeBuilder->getRootNode(); $root ->children() diff --git a/src/LightSaml/SpBundle/DependencyInjection/Security/Factory/LightSamlSpFactory.php b/src/LightSaml/SpBundle/DependencyInjection/Security/Factory/LightSamlSpFactory.php index 758c129..c7851fb 100644 --- a/src/LightSaml/SpBundle/DependencyInjection/Security/Factory/LightSamlSpFactory.php +++ b/src/LightSaml/SpBundle/DependencyInjection/Security/Factory/LightSamlSpFactory.php @@ -45,20 +45,13 @@ public function addConfiguration(NodeDefinition $node) * * @return string never null, the id of the authentication provider */ - protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId) + public function createAuthenticator(ContainerBuilder $container, string $firewallName, array $config, string $userProviderId): string|array { - if (class_exists('Symfony\Component\DependencyInjection\ChildDefinition')) { - // Symfony >= 3.3 - $definition = new ChildDefinition('security.authentication.provider.lightsaml_sp'); - } else { - // Symfony < 3.3 - $definition = new DefinitionDecorator('security.authentication.provider.lightsaml_sp'); - } - - $providerId = 'security.authentication.provider.lightsaml_sp.'.$id; + $definition = new ChildDefinition('security.authentication.provider.lightsaml_sp'); + $providerId = 'security.authentication.provider.lightsaml_sp.'.$firewallName; $provider = $container ->setDefinition($providerId, $definition) - ->replaceArgument(0, $id) + ->replaceArgument(0, $firewallName) ->replaceArgument(2, $config['force']) ; if (isset($config['provider'])) { @@ -111,7 +104,12 @@ public function getPosition() return 'form'; } - public function getKey() + public function getPriority(): int + { + return 0; + } + + public function getKey(): string { return 'light_saml_sp'; } diff --git a/src/LightSaml/SpBundle/LightSamlSpBundle.php b/src/LightSaml/SpBundle/LightSamlSpBundle.php index 18169f6..70c09e9 100644 --- a/src/LightSaml/SpBundle/LightSamlSpBundle.php +++ b/src/LightSaml/SpBundle/LightSamlSpBundle.php @@ -12,6 +12,7 @@ namespace LightSaml\SpBundle; use LightSaml\SpBundle\DependencyInjection\Security\Factory\LightSamlSpFactory; +use Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -22,6 +23,7 @@ public function build(ContainerBuilder $container) parent::build($container); $extension = $container->getExtension('security'); - $extension->addSecurityListenerFactory(new LightSamlSpFactory()); + \assert($extension instanceof SecurityExtension); + $extension->addAuthenticatorFactory(new LightSamlSpFactory()); } } diff --git a/src/LightSaml/SpBundle/Resources/config/services.yml b/src/LightSaml/SpBundle/Resources/config/services.yml index bd9ed5f..6633562 100644 --- a/src/LightSaml/SpBundle/Resources/config/services.yml +++ b/src/LightSaml/SpBundle/Resources/config/services.yml @@ -3,6 +3,17 @@ parameters: lightsaml.route.login_check: lightsaml_sp.login_check services: + LightSaml\SpBundle\Controller\DefaultController: + public: true + tags: ['controller.service_arguments'] + calls: + - [ setContainer, [ "@service_container" ] ] + arguments: + - "@lightsaml.container.build" + - "@ligthsaml.profile.login_factory" + - "@ligthsaml.profile.metadata" + - "%lightsaml_sp.route.discovery%" + lightsaml_sp.username_mapper.simple: class: LightSaml\SpBundle\Security\User\SimpleUsernameMapper arguments: