From 09d07cd7dbba49f842731787a08e6e31c1b1e80c Mon Sep 17 00:00:00 2001 From: Alex Rock Ancelet Date: Wed, 27 Feb 2019 21:53:25 +0100 Subject: [PATCH] Make UserValueResolver accept any subtype of UserInterface --- .../SecurityBundle/SecurityUserValueResolver.php | 3 ++- .../Http/Controller/UserValueResolver.php | 3 ++- .../Tests/Controller/UserValueResolverTest.php | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php index 476e24ee4e456..51ff483f531c2 100644 --- a/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php +++ b/src/Symfony/Bundle/SecurityBundle/SecurityUserValueResolver.php @@ -40,7 +40,8 @@ public function __construct(TokenStorageInterface $tokenStorage) public function supports(Request $request, ArgumentMetadata $argument) { // only security user implementations are supported - if (UserInterface::class !== $argument->getType()) { + $type = $argument->getType(); + if (UserInterface::class !== $type && !is_subclass_of($type, UserInterface::class)) { return false; } diff --git a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php index 221d8d8eada5c..959b533f8c713 100644 --- a/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php +++ b/src/Symfony/Component/Security/Http/Controller/UserValueResolver.php @@ -35,7 +35,8 @@ public function __construct(TokenStorageInterface $tokenStorage) public function supports(Request $request, ArgumentMetadata $argument) { // only security user implementations are supported - if (UserInterface::class !== $argument->getType()) { + $type = $argument->getType(); + if (UserInterface::class !== $type && !is_subclass_of($type, UserInterface::class)) { return false; } diff --git a/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php b/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php index 8bcb960aa66ed..2a50e0bab9511 100644 --- a/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php @@ -17,7 +17,6 @@ use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; -use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Http\Controller\UserValueResolver; @@ -69,6 +68,20 @@ public function testResolve() $this->assertSame([$user], iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); } + public function testResolveWithSubclass() + { + $user = $this->getMockForAbstractClass(DummySubUser::class); + $token = new UsernamePasswordToken($user, 'password', 'provider'); + $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([$user], iterator_to_array($resolver->resolve(Request::create('/'), $metadata))); + } + public function testIntegration() { $user = $this->getMockBuilder(UserInterface::class)->getMock();