Skip to content

Commit 4de1563

Browse files
committed
feature symfony#56838 [Security] Deprecate argument $secret of RememberMeToken and RememberMeAuthenticator (nicolas-grekas)
This PR was merged into the 7.2 branch. Discussion ---------- [Security] Deprecate argument $secret of RememberMeToken and RememberMeAuthenticator | Q | A | ------------- | --- | Branch? | 7.2 | Bug fix? | no | New feature? | no | Deprecations? | yes | Issues | - | License | MIT One less use for `kernel.secret`. The secret is not used since the new authentication system. Commits ------- 6909ec9 [Security] Deprecate argument $secret of RememberMeToken and RememberMeAuthenticator
2 parents 64fa4b5 + 6909ec9 commit 4de1563

File tree

15 files changed

+71
-32
lines changed

15 files changed

+71
-32
lines changed

UPGRADE-7.2.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
UPGRADE FROM 7.1 to 7.2
2+
=======================
3+
4+
Symfony 7.2 is a minor release. According to the Symfony release process, there should be no significant
5+
backward compatibility breaks. Minor backward compatibility breaks are prefixed in this document with
6+
`[BC BREAK]`, make sure your code is compatible with these entries before upgrading.
7+
Read more about this in the [Symfony documentation](https://symfony.com/doc/7.2/setup/upgrade_minor.html).
8+
9+
If you're upgrading from a version below 7.1, follow the [7.1 upgrade guide](UPGRADE-7.1.md) first.
10+
11+
Security
12+
--------
13+
14+
* Deprecate argument `$secret` of `RememberMeToken` and `RememberMeAuthenticator`

src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public function createAuthenticator(ContainerBuilder $container, string $firewal
107107
$container
108108
->setDefinition($authenticatorId, new ChildDefinition('security.authenticator.remember_me'))
109109
->replaceArgument(0, new Reference($rememberMeHandlerId))
110-
->replaceArgument(3, $config['name'] ?? $this->options['name'])
110+
->replaceArgument(2, $config['name'] ?? $this->options['name'])
111111
;
112112

113113
return $authenticatorId;

src/Symfony/Bundle/SecurityBundle/Resources/config/security_authenticator_remember_me.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@
8585
->abstract()
8686
->args([
8787
abstract_arg('remember me handler'),
88-
param('kernel.secret'),
8988
service('security.token_storage'),
9089
abstract_arg('options'),
9190
service('logger')->nullOnInvalid(),

src/Symfony/Bundle/SecurityBundle/composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
"symfony/http-kernel": "^6.4|^7.0",
2727
"symfony/http-foundation": "^6.4|^7.0",
2828
"symfony/password-hasher": "^6.4|^7.0",
29-
"symfony/security-core": "^6.4|^7.0",
29+
"symfony/security-core": "^7.2",
3030
"symfony/security-csrf": "^6.4|^7.0",
31-
"symfony/security-http": "^7.1",
31+
"symfony/security-http": "^7.2",
3232
"symfony/service-contracts": "^2.5|^3"
3333
},
3434
"require-dev": {

src/Symfony/Component/Security/Core/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

src/Symfony/Component/Security/Core/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
---

src/Symfony/Component/Security/Core/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

src/Symfony/Component/Security/Core/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'])

src/Symfony/Component/Security/Core/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 [

src/Symfony/Component/Security/Core/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) {

0 commit comments

Comments
 (0)