Skip to content

Commit 74ebf9b

Browse files
[Security] Deprecate argument $secret of RememberMeToken and RememberMeAuthenticator
1 parent 5e792c3 commit 74ebf9b

File tree

7 files changed

+29
-20
lines changed

7 files changed

+29
-20
lines changed

Authentication/Token/RememberMeToken.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,26 @@
2121
*/
2222
class RememberMeToken extends AbstractToken
2323
{
24-
private string $secret;
24+
private ?string $secret = null;
2525
private string $firewallName;
2626

2727
/**
28-
* @param string $secret A secret used to make sure the token is created by the app and not by a malicious client
29-
*
3028
* @throws \InvalidArgumentException
3129
*/
32-
public function __construct(UserInterface $user, string $firewallName, #[\SensitiveParameter] string $secret)
30+
public function __construct(UserInterface $user, string $firewallName)
3331
{
3432
parent::__construct($user->getRoles());
3533

36-
if (!$secret) {
37-
throw new InvalidArgumentException('A non-empty secret is required.');
34+
if (\func_num_args() > 2) {
35+
trigger_deprecation('symfony/security-core', '7.2', 'The "$secret" argument of "%s()" is deprecated.', __METHOD__);
36+
$this->secret = func_get_arg(2);
3837
}
3938

4039
if (!$firewallName) {
4140
throw new InvalidArgumentException('$firewallName must not be empty.');
4241
}
4342

4443
$this->firewallName = $firewallName;
45-
$this->secret = $secret;
4644

4745
$this->setUser($user);
4846
}
@@ -52,13 +50,19 @@ public function getFirewallName(): string
5250
return $this->firewallName;
5351
}
5452

53+
/**
54+
* @deprecated since Symfony 7.2
55+
*/
5556
public function getSecret(): string
5657
{
57-
return $this->secret;
58+
trigger_deprecation('symfony/security-core', '7.2', 'The "%s()" method is deprecated.', __METHOD__);
59+
60+
return $this->secret ??= base64_encode(random_bytes(8));
5861
}
5962

6063
public function __serialize(): array
6164
{
65+
// $this->firewallName should be kept at index 1 for compatibility with payloads generated before Symfony 8
6266
return [$this->secret, $this->firewallName, parent::__serialize()];
6367
}
6468

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
CHANGELOG
22
=========
33

4+
7.2
5+
---
6+
7+
* Deprecate argument `$secret` of `RememberMeToken`
48

59
7.0
610
---

Tests/Authentication/AuthenticationTrustResolverTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ protected function getRememberMeToken()
7272
{
7373
$user = new InMemoryUser('wouter', '', ['ROLE_USER']);
7474

75-
return new RememberMeToken($user, 'main', 'secret');
75+
return new RememberMeToken($user, 'main');
7676
}
7777
}
7878

Tests/Authentication/Token/RememberMeTokenTest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,22 @@ class RememberMeTokenTest extends TestCase
2020
public function testConstructor()
2121
{
2222
$user = $this->getUser();
23-
$token = new RememberMeToken($user, 'fookey', 'foo');
23+
$token = new RememberMeToken($user, 'fookey');
2424

2525
$this->assertEquals('fookey', $token->getFirewallName());
26-
$this->assertEquals('foo', $token->getSecret());
2726
$this->assertEquals(['ROLE_FOO'], $token->getRoleNames());
2827
$this->assertSame($user, $token->getUser());
2928
}
3029

31-
public function testConstructorSecretCannotBeEmptyString()
30+
/**
31+
* @group legacy
32+
*/
33+
public function testSecret()
3234
{
33-
$this->expectException(\InvalidArgumentException::class);
34-
new RememberMeToken(
35-
$this->getUser(),
36-
'',
37-
''
38-
);
35+
$user = $this->getUser();
36+
$token = new RememberMeToken($user, 'fookey', 'foo');
37+
38+
$this->assertEquals('foo', $token->getSecret());
3939
}
4040

4141
protected function getUser($roles = ['ROLE_FOO'])

Tests/Authorization/ExpressionLanguageTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static function provider()
5050
$user = new InMemoryUser('username', 'password', $roles);
5151

5252
$noToken = null;
53-
$rememberMeToken = new RememberMeToken($user, 'firewall-name', 'firewall');
53+
$rememberMeToken = new RememberMeToken($user, 'firewall-name');
5454
$usernamePasswordToken = new UsernamePasswordToken($user, 'firewall-name', $roles);
5555

5656
return [

Tests/Authorization/Voter/AuthenticatedVoterTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public function getCredentials()
101101
}
102102

103103
if ('remembered' === $authenticated) {
104-
return new RememberMeToken($user, 'foo', 'bar');
104+
return new RememberMeToken($user, 'foo');
105105
}
106106

107107
if ('impersonated' === $authenticated) {

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
],
1818
"require": {
1919
"php": ">=8.2",
20+
"symfony/deprecation-contracts": "^2.5|^3",
2021
"symfony/event-dispatcher-contracts": "^2.5|^3",
2122
"symfony/service-contracts": "^2.5|^3",
2223
"symfony/password-hasher": "^6.4|^7.0"

0 commit comments

Comments
 (0)