Skip to content

Commit 870fa69

Browse files
VincentLangletfabpot
authored andcommitted
[Security] Support union type for #[CurrentUser] attribute
1 parent 8150927 commit 870fa69

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

src/Symfony/Component/Security/Http/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
7.4
55
---
66

7+
* Add support for union types with `#[CurrentUser]`
78
* Deprecate callable firewall listeners, extend `AbstractListener` or implement `FirewallListenerInterface` instead
89
* Deprecate `AbstractListener::__invoke`
910

src/Symfony/Component/Security/Http/Controller/UserValueResolver.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public function resolve(Request $request, ArgumentMetadata $argument): array
5757
return [$user];
5858
}
5959

60+
$types = explode('|', $argument->getType());
61+
foreach ($types as $type) {
62+
if ($user instanceof $type) {
63+
return [$user];
64+
}
65+
}
66+
6067
throw new AccessDeniedException(\sprintf('The logged-in user is an instance of "%s" but a user of type "%s" is expected.', $user::class, $argument->getType()));
6168
}
6269
}

src/Symfony/Component/Security/Http/Tests/Controller/UserValueResolverTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
2222
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
2323
use Symfony\Component\Security\Core\User\InMemoryUser;
24+
use Symfony\Component\Security\Core\User\OAuth2User;
2425
use Symfony\Component\Security\Core\User\UserInterface;
2526
use Symfony\Component\Security\Http\Attribute\CurrentUser;
2627
use Symfony\Component\Security\Http\Controller\UserValueResolver;
@@ -109,6 +110,19 @@ public function testResolveSucceedsWithTypedAttribute()
109110
$this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata));
110111
}
111112

113+
public function testResolveSucceedsWithUnionTypedAttribute()
114+
{
115+
$user = new InMemoryUser('username', 'password');
116+
$token = new UsernamePasswordToken($user, 'provider');
117+
$tokenStorage = new TokenStorage();
118+
$tokenStorage->setToken($token);
119+
120+
$resolver = new UserValueResolver($tokenStorage);
121+
$metadata = new ArgumentMetadata('foo', InMemoryUser::class.'|'.OAuth2User::class, false, false, null, false, [new CurrentUser()]);
122+
123+
$this->assertSame([$user], $resolver->resolve(Request::create('/'), $metadata));
124+
}
125+
112126
public function testResolveThrowsAccessDeniedWithWrongUserClass()
113127
{
114128
$user = $this->createMock(UserInterface::class);

0 commit comments

Comments
 (0)