Skip to content

Commit 2ac7230

Browse files
Merge branch '5.4' into 6.0
* 5.4: [Security] make TokenInterface::getUser() nullable to tell about unauthenticated tokens [Messenger] fix compat with Serializer v6
2 parents 2f0541d + 1d04928 commit 2ac7230

File tree

8 files changed

+52
-27
lines changed

8 files changed

+52
-27
lines changed

Authentication/AuthenticationTrustResolver.php

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\Security\Core\Authentication;
1313

14-
use Symfony\Component\Security\Core\Authentication\Token\NullToken;
1514
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
1615
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1716

@@ -24,30 +23,22 @@ class AuthenticationTrustResolver implements AuthenticationTrustResolverInterfac
2423
{
2524
public function isAuthenticated(TokenInterface $token = null): bool
2625
{
27-
return null !== $token && !$token instanceof NullToken;
26+
return $token && $token->getUser();
2827
}
2928

3029
/**
3130
* {@inheritdoc}
3231
*/
3332
public function isRememberMe(TokenInterface $token = null)
3433
{
35-
if (null === $token) {
36-
return false;
37-
}
38-
39-
return $token instanceof RememberMeToken;
34+
return $token && $token instanceof RememberMeToken;
4035
}
4136

4237
/**
4338
* {@inheritdoc}
4439
*/
4540
public function isFullFledged(TokenInterface $token = null)
4641
{
47-
if (null === $token || $token instanceof NullToken) {
48-
return false;
49-
}
50-
51-
return !$this->isRememberMe($token);
42+
return $this->isAuthenticated($token) && !$this->isRememberMe($token);
5243
}
5344
}

Authentication/Token/NullToken.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function getRoleNames(): array
3030

3131
public function getUser()
3232
{
33-
return '';
33+
return null;
3434
}
3535

3636
public function setUser(UserInterface $user)

Authentication/Token/TokenInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function getRoleNames(): array;
4040
/**
4141
* Returns a user representation.
4242
*
43-
* @return UserInterface
43+
* @return UserInterface|null
4444
*
4545
* @see AbstractToken::setUser()
4646
*/

Authorization/AuthorizationChecker.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class AuthorizationChecker implements AuthorizationCheckerInterface
3232

3333
public function __construct(TokenStorageInterface $tokenStorage, AccessDecisionManagerInterface $accessDecisionManager, bool $exceptionOnNoToken = false)
3434
{
35-
if (false !== $exceptionOnNoToken) {
35+
if ($exceptionOnNoToken) {
3636
throw new \LogicException('Argument $exceptionOnNoToken of "%s()" must be set to "false".', __METHOD__);
3737
}
3838

@@ -48,7 +48,11 @@ public function __construct(TokenStorageInterface $tokenStorage, AccessDecisionM
4848
*/
4949
final public function isGranted(mixed $attribute, mixed $subject = null): bool
5050
{
51-
$token = $this->tokenStorage->getToken() ?? new NullToken();
51+
$token = $this->tokenStorage->getToken();
52+
53+
if (!$token || !$token->getUser()) {
54+
$token = new NullToken();
55+
}
5256

5357
return $this->accessDecisionManager->decide($token, [$attribute], $subject);
5458
}

Authorization/Voter/AuthenticatedVoter.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Component\Security\Core\Authorization\Voter;
1313

1414
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
15-
use Symfony\Component\Security\Core\Authentication\Token\NullToken;
1615
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
1716
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1817

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CHANGELOG
2525
* Deprecate setting the `$alwaysAuthenticate` argument to `true` and not setting the
2626
`$exceptionOnNoToken` argument to `false` of `AuthorizationChecker`
2727
* Deprecate methods `TokenInterface::isAuthenticated()` and `setAuthenticated`,
28-
tokens will always be considered authenticated in 6.0
28+
return null from "getUser()" instead when a token is not authenticated
2929

3030
5.3
3131
---

Tests/Authentication/AuthenticationTrustResolverTest.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public function testIsRememberMe()
2525
$resolver = new AuthenticationTrustResolver();
2626

2727
$this->assertFalse($resolver->isRememberMe(null));
28-
$this->assertFalse($resolver->isRememberMe($this->getToken()));
2928
$this->assertFalse($resolver->isRememberMe(new FakeCustomToken()));
3029
$this->assertTrue($resolver->isRememberMe(new RealCustomRememberMeToken()));
3130
$this->assertTrue($resolver->isRememberMe($this->getRememberMeToken()));
@@ -38,7 +37,6 @@ public function testisFullFledged()
3837
$this->assertFalse($resolver->isFullFledged(null));
3938
$this->assertFalse($resolver->isFullFledged($this->getRememberMeToken()));
4039
$this->assertFalse($resolver->isFullFledged(new RealCustomRememberMeToken()));
41-
$this->assertTrue($resolver->isFullFledged($this->getToken()));
4240
$this->assertTrue($resolver->isFullFledged(new FakeCustomToken()));
4341
}
4442

@@ -50,9 +48,24 @@ public function testIsAuthenticated()
5048
$this->assertTrue($resolver->isAuthenticated(new FakeCustomToken()));
5149
}
5250

53-
protected function getToken()
51+
public function testIsRememberMeWithClassAsConstructorButStillExtending()
5452
{
55-
return $this->createMock(TokenInterface::class);
53+
$resolver = new AuthenticationTrustResolver();
54+
55+
$this->assertFalse($resolver->isRememberMe(null));
56+
$this->assertFalse($resolver->isRememberMe(new FakeCustomToken()));
57+
$this->assertTrue($resolver->isRememberMe($this->getRememberMeToken()));
58+
$this->assertTrue($resolver->isRememberMe(new RealCustomRememberMeToken()));
59+
}
60+
61+
public function testisFullFledgedWithClassAsConstructorButStillExtending()
62+
{
63+
$resolver = new AuthenticationTrustResolver();
64+
65+
$this->assertFalse($resolver->isFullFledged(null));
66+
$this->assertFalse($resolver->isFullFledged($this->getRememberMeToken()));
67+
$this->assertFalse($resolver->isFullFledged(new RealCustomRememberMeToken()));
68+
$this->assertTrue($resolver->isFullFledged(new FakeCustomToken()));
5669
}
5770

5871
protected function getRememberMeToken()
@@ -95,6 +108,7 @@ public function getCredentials(): mixed
95108

96109
public function getUser(): UserInterface
97110
{
111+
return new InMemoryUser('wouter', '', ['ROLE_USER']);
98112
}
99113

100114
public function setUser($user)

Tests/Authorization/Voter/AuthenticatedVoterTest.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
16+
use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
17+
use Symfony\Component\Security\Core\Authentication\Token\NullToken;
1618
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
1719
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
18-
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1920
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
2021
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
22+
use Symfony\Component\Security\Core\User\InMemoryUser;
2123

2224
class AuthenticatedVoterTest extends TestCase
2325
{
@@ -53,12 +55,27 @@ public function getVoteTests()
5355

5456
protected function getToken($authenticated)
5557
{
58+
$user = new InMemoryUser('wouter', '', ['ROLE_USER']);
59+
5660
if ('fully' === $authenticated) {
57-
return $this->createMock(TokenInterface::class);
58-
} elseif ('remembered' === $authenticated) {
59-
return $this->getMockBuilder(RememberMeToken::class)->setMethods(['setPersistent'])->disableOriginalConstructor()->getMock();
60-
} elseif ('impersonated' === $authenticated) {
61+
$token = new class() extends AbstractToken {
62+
public function getCredentials()
63+
{
64+
}
65+
};
66+
$token->setUser($user);
67+
68+
return $token;
69+
}
70+
71+
if ('remembered' === $authenticated) {
72+
return new RememberMeToken($user, 'foo', 'bar');
73+
}
74+
75+
if ('impersonated' === $authenticated) {
6176
return $this->getMockBuilder(SwitchUserToken::class)->disableOriginalConstructor()->getMock();
6277
}
78+
79+
return new NullToken();
6380
}
6481
}

0 commit comments

Comments
 (0)