diff --git a/UPGRADE-3.3.md b/UPGRADE-3.3.md index 490415f1a5..f15fa7dbd5 100644 --- a/UPGRADE-3.3.md +++ b/UPGRADE-3.3.md @@ -94,6 +94,9 @@ Process Security -------- + * Deprecated the ability to pass multiple user providers to the `ContextListener`. Pass only the user provider responsible + for the active firewall instead. + * The `RoleInterface` has been deprecated. Extend the `Symfony\Component\Security\Core\Role\Role` class in your custom role implementations instead. diff --git a/UPGRADE-4.0.md b/UPGRADE-4.0.md index ad00aebc78..8b443a5bc8 100644 --- a/UPGRADE-4.0.md +++ b/UPGRADE-4.0.md @@ -252,6 +252,9 @@ Process Security -------- + * Dropped support for passing multiple user providers to the `ContextListener`. Pass only the user provider responsible + for the active firewall instead. + * The `RoleInterface` has been removed. Extend the `Symfony\Component\Security\Core\Role\Role` class instead. diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index f59ad4e5b3..9cff0b3c1a 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -434,7 +434,7 @@ class SecurityExtension extends Extension $listenerId = 'security.context_listener.'.count($this->contextListeners); $listener = $container->setDefinition($listenerId, new ChildDefinition('security.context_listener')); - $listener->replaceArgument(1, array(new Reference($providerId))); + $listener->replaceArgument(1, new Reference($providerId)); $listener->replaceArgument(2, $contextKey); return $this->contextListeners[$contextKey] = $listenerId; diff --git a/src/Symfony/Component/Security/CHANGELOG.md b/src/Symfony/Component/Security/CHANGELOG.md index 6bebfba400..9ac9c54981 100644 --- a/src/Symfony/Component/Security/CHANGELOG.md +++ b/src/Symfony/Component/Security/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +3.3.0 +----- + + * Deprecated the ability to pass multiple user providers to the `ContextListener`. Pass only the user provider responsible + for the active firewall instead. + 3.2.0 ----- diff --git a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php index 4d6f3f81f1..ef57ac42c4 100644 --- a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php +++ b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php @@ -44,12 +44,26 @@ class ContextListener implements ListenerInterface private $registered; private $trustResolver; - public function __construct(TokenStorageInterface $tokenStorage, array $userProviders, $contextKey, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, AuthenticationTrustResolverInterface $trustResolver = null) + /** + * @param TokenStorageInterface $tokenStorage + * @param UserProviderInterface|UserProviderInterface[] $userProviders + * @param string $contextKey + * @param LoggerInterface|null $logger + * @param EventDispatcherInterface|null $dispatcher + * @param AuthenticationTrustResolverInterface|null $trustResolver + */ + public function __construct(TokenStorageInterface $tokenStorage, $userProviders, $contextKey, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, AuthenticationTrustResolverInterface $trustResolver = null) { if (empty($contextKey)) { throw new \InvalidArgumentException('$contextKey must not be empty.'); } + if (is_array($userProviders)) { + @trigger_error(sprintf('Being able to pass multiple user providers to the constructor of %s is deprecated since version 3.3 and will not be supported anymore in 4.0. Only pass the user provider for the current firewall context instead.', __CLASS__), E_USER_DEPRECATED); + } else { + $userProviders = array($userProviders); + } + foreach ($userProviders as $userProvider) { if (!$userProvider instanceof UserProviderInterface) { throw new \InvalidArgumentException(sprintf('User provider "%s" must implement "Symfony\Component\Security\Core\User\UserProviderInterface".', get_class($userProvider))); diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php index be7b72f5d0..1ed0663aae 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php @@ -22,6 +22,7 @@ use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; +use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Firewall\ContextListener; use Symfony\Component\EventDispatcher\EventDispatcher; @@ -35,12 +36,13 @@ class ContextListenerTest extends TestCase { new ContextListener( $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock(), - array(), + $this->getMockBuilder(UserProviderInterface::class)->getMock(), '' ); } /** + * @group legacy * @expectedException \InvalidArgumentException * @expectedExceptionMessage User provider "stdClass" must implement "Symfony\Component\Security\Core\User\UserProviderInterface */ @@ -109,7 +111,7 @@ class ContextListenerTest extends TestCase new Response() ); - $listener = new ContextListener($tokenStorage, array(), 'session', null, new EventDispatcher()); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'session', null, new EventDispatcher()); $listener->onKernelResponse($event); $this->assertTrue($session->isStarted()); @@ -128,7 +130,7 @@ class ContextListenerTest extends TestCase new Response() ); - $listener = new ContextListener(new TokenStorage(), array(), 'session', null, new EventDispatcher()); + $listener = new ContextListener(new TokenStorage(), $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'session', null, new EventDispatcher()); $listener->onKernelResponse($event); $this->assertFalse($session->isStarted()); @@ -163,7 +165,7 @@ class ContextListenerTest extends TestCase ->method('setToken') ->with(null); - $listener = new ContextListener($tokenStorage, array(), 'key123'); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'key123'); $listener->handle($event); } @@ -184,7 +186,7 @@ class ContextListenerTest extends TestCase ->disableOriginalConstructor() ->getMock(); - $listener = new ContextListener($tokenStorage, array(), 'key123', null, $dispatcher); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'key123', null, $dispatcher); $event->expects($this->any()) ->method('isMasterRequest') @@ -208,7 +210,7 @@ class ContextListenerTest extends TestCase ->disableOriginalConstructor() ->getMock(); - $listener = new ContextListener($tokenStorage, array(), 'key123', null, $dispatcher); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'key123', null, $dispatcher); $request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->getMock(); $request->expects($this->any()) @@ -242,7 +244,7 @@ class ContextListenerTest extends TestCase $tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock(); $tokenStorage->expects($this->once())->method('setToken')->with(null); - $listener = new ContextListener($tokenStorage, array(), 'key123'); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'key123'); $listener->handle($event); } @@ -268,7 +270,7 @@ class ContextListenerTest extends TestCase new Response() ); - $listener = new ContextListener($tokenStorage, array(), 'session', null, new EventDispatcher()); + $listener = new ContextListener($tokenStorage, $this->getMockBuilder(UserProviderInterface::class)->getMock(), 'session', null, new EventDispatcher()); $listener->onKernelResponse($event); return $session;