diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php index 476e24ee4e456..b8a2454f96be1 100644 --- a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php +++ b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php @@ -40,7 +40,7 @@ public function __construct(TokenStorageInterface $tokenStorage) public function supports(Request $request, ArgumentMetadata $argument) { // only security user implementations are supported - if (UserInterface::class !== $argument->getType()) { + if (!$argument->getType() || !$this->implementsCorrectInterface($argument->getType())) { return false; } @@ -59,4 +59,14 @@ public function resolve(Request $request, ArgumentMetadata $argument) { yield $this->tokenStorage->getToken()->getUser(); } + + /** + * @param string $type + * + * @return bool + */ + private function implementsCorrectInterface($type) + { + return UserInterface::class === $type || array_key_exists(UserInterface::class, class_implements($type)); + } } diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php index a8f005b2e4318..53e20b187f4fc 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php @@ -72,6 +72,21 @@ public function testResolve() $this->assertSame(array($user), iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); } + public function testResolveUserInterfaceImplementation() + { + $user = $this->getMockBuilder(UserInterface::class)->getMock(); + $token = $this->getMockBuilder(TokenInterface::class)->getMock(); + $token->expects($this->any())->method('getUser')->willReturn($user); + $tokenStorage = new TokenStorage(); + $tokenStorage->setToken($token); + + $resolver = new SecurityUserValueResolver($tokenStorage); + $metadata = new ArgumentMetadata('foo', DummySubUser::class, false, false, null); + + $this->assertTrue($resolver->supports(Request::create('/'), $metadata)); + $this->assertSame(array($user), iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); + } + public function testIntegration() { $user = $this->getMockBuilder(UserInterface::class)->getMock(); diff --git a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php index 221d8d8eada5c..01f83a59daefb 100644 --- a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php +++ b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php @@ -35,7 +35,7 @@ public function __construct(TokenStorageInterface $tokenStorage) public function supports(Request $request, ArgumentMetadata $argument) { // only security user implementations are supported - if (UserInterface::class !== $argument->getType()) { + if (!$argument->getType() || !$this->implementsCorrectInterface($argument->getType())) { return false; } @@ -54,4 +54,14 @@ public function resolve(Request $request, ArgumentMetadata $argument) { yield $this->tokenStorage->getToken()->getUser(); } + + /** + * @param string $type + * + * @return bool + */ + private function implementsCorrectInterface($type) + { + return UserInterface::class === $type || array_key_exists(UserInterface::class, class_implements($type)); + } } diff --git a/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php b/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php index 62f4c1262120c..20c31098226b9 100644 --- a/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php @@ -69,6 +69,21 @@ public function testResolve() $this->assertSame(array($user), iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); } + public function testResolveUserInterfaceImplementation() + { + $user = $this->getMockBuilder(UserInterface::class)->getMock(); + $token = $this->getMockBuilder(TokenInterface::class)->getMock(); + $token->expects($this->any())->method('getUser')->willReturn($user); + $tokenStorage = new TokenStorage(); + $tokenStorage->setToken($token); + + $resolver = new UserValueResolver($tokenStorage); + $metadata = new ArgumentMetadata('foo', DummySubUser::class, false, false, null); + + $this->assertTrue($resolver->supports(Request::create('/'), $metadata)); + $this->assertSame(array($user), iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); + } + public function testIntegration() { $user = $this->getMockBuilder(UserInterface::class)->getMock();
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: