From d6ee0324101e486cbc42dc5a46e4c286eadccbd0 Mon Sep 17 00:00:00 2001 From: David Kmenta Date: Wed, 18 Apr 2018 11:34:30 +0200 Subject: [PATCH 1/3] UserValueResolver and SecurityUserValueResolver should also resolve class implementing UserInterface --- .../SecurityBundle/SecurityUserValueResolver.php | 11 ++++++++++- .../Tests/SecurityUserValueResolverTest.php | 15 +++++++++++++++ .../Http/Controller/UserValueResolver.php | 11 ++++++++++- .../Tests/Controller/UserValueResolverTest.php | 15 +++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php index 476e24ee4e456..323ce4adf0cf4 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,13 @@ public function resolve(Request $request, ArgumentMetadata $argument) { yield $this->tokenStorage->getToken()->getUser(); } + + /** + * @param string $type + * @return bool + */ + private function implementsCorrectInterface($type) + { + return $type === UserInterface::class || 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..1d0dc27ea156c 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,13 @@ public function resolve(Request $request, ArgumentMetadata $argument) { yield $this->tokenStorage->getToken()->getUser(); } + + /** + * @param string $type + * @return bool + */ + private function implementsCorrectInterface($type) + { + return $type === UserInterface::class || 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(); From 185567a789f2b04d4a3a629f1c6e0ffc3b50f082 Mon Sep 17 00:00:00 2001 From: David Kmenta Date: Wed, 18 Apr 2018 11:51:21 +0200 Subject: [PATCH 2/3] fixup! UserValueResolver and SecurityUserValueResolver should also resolve class implementing UserInterface --- src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php | 2 +- .../Component/Security/Http/Controller/UserValueResolver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php index 323ce4adf0cf4..85d991a715849 100644 --- a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php +++ b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php @@ -66,6 +66,6 @@ public function resolve(Request $request, ArgumentMetadata $argument) */ private function implementsCorrectInterface($type) { - return $type === UserInterface::class || array_key_exists(UserInterface::class, class_implements($type)); + return UserInterface::class === $type || array_key_exists(UserInterface::class, class_implements($type)); } } diff --git a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php index 1d0dc27ea156c..5298c0432f2d1 100644 --- a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php +++ b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php @@ -61,6 +61,6 @@ public function resolve(Request $request, ArgumentMetadata $argument) */ private function implementsCorrectInterface($type) { - return $type === UserInterface::class || array_key_exists(UserInterface::class, class_implements($type)); + return UserInterface::class === $type || array_key_exists(UserInterface::class, class_implements($type)); } } From 2613ab2d7e28f8171f1f57bca44cf8fe5ffaa500 Mon Sep 17 00:00:00 2001 From: David Kmenta Date: Wed, 18 Apr 2018 11:52:06 +0200 Subject: [PATCH 3/3] fixup! UserValueResolver and SecurityUserValueResolver should also resolve class implementing UserInterface --- src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php | 1 + .../Component/Security/Http/Controller/UserValueResolver.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php index 85d991a715849..b8a2454f96be1 100644 --- a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php +++ b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php @@ -62,6 +62,7 @@ public function resolve(Request $request, ArgumentMetadata $argument) /** * @param string $type + * * @return bool */ private function implementsCorrectInterface($type) diff --git a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php index 5298c0432f2d1..01f83a59daefb 100644 --- a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php +++ b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php @@ -57,6 +57,7 @@ public function resolve(Request $request, ArgumentMetadata $argument) /** * @param string $type + * * @return bool */ private function implementsCorrectInterface($type)