Skip to content

Commit 152024e

Browse files
committed
Disable session usage tracking from Security helper when there is no request
1 parent 9c2a9c8 commit 152024e

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
->args([service_locator([
9191
'security.token_storage' => service('security.token_storage'),
9292
'security.authorization_checker' => service('security.authorization_checker'),
93+
'request_stack' => service('request_stack'),
9394
])])
9495
->alias(Security::class, 'security.helper')
9596

src/Symfony/Component/Security/Core/Authentication/Token/Storage/UsageTrackingTokenStorage.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public function disableUsageTracking(): void
7070
$this->enableUsageTracking = false;
7171
}
7272

73+
public function isUsageTrackingEnabled(): bool
74+
{
75+
return $this->enableUsageTracking;
76+
}
77+
7378
public static function getSubscribedServices(): array
7479
{
7580
return [

src/Symfony/Component/Security/Core/Security.php

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

1414
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
1516
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1617
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
1718
use Symfony\Component\Security\Core\User\UserInterface;
@@ -67,6 +68,20 @@ public function isGranted($attributes, $subject = null): bool
6768

6869
public function getToken(): ?TokenInterface
6970
{
70-
return $this->container->get('security.token_storage')->getToken();
71+
$tokenStorage = $this->container->get('security.token_storage');
72+
73+
if (!$tokenStorage instanceof UsageTrackingTokenStorage) {
74+
return $tokenStorage->getToken();
75+
}
76+
77+
if (!$this->container->get('request_stack')->getMainRequest() && $tokenStorage->isUsageTrackingEnabled()) {
78+
$tokenStorage->disableUsageTracking();
79+
$token = $tokenStorage->getToken();
80+
$tokenStorage->enableUsageTracking();
81+
82+
return $token;
83+
}
84+
85+
return $tokenStorage->getToken();
7186
}
7287
}

src/Symfony/Component/Security/Core/Tests/SecurityTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Psr\Container\ContainerInterface;
16+
use Symfony\Component\DependencyInjection\ServiceLocator;
17+
use Symfony\Component\HttpFoundation\RequestStack;
1618
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
19+
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
1720
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
1821
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
1922
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
@@ -37,6 +40,33 @@ public function testGetToken()
3740
$this->assertSame($token, $security->getToken());
3841
}
3942

43+
public function testGetTokenDisablesUsageTrackingWhenThereIsNoRequest()
44+
{
45+
$token = new UsernamePasswordToken('foo', 'bar', 'provider');
46+
$tokenStorage = $this->createMock(TokenStorageInterface::class);
47+
$requestStackFactory = function (): RequestStack { return new RequestStack(); };
48+
49+
$usageTrackingTokenStorage = new UsageTrackingTokenStorage($tokenStorage, new ServiceLocator([
50+
'request_stack' => $requestStackFactory,
51+
]));
52+
$usageTrackingTokenStorage->enableUsageTracking();
53+
54+
$tokenStorage->expects($this->once())
55+
->method('getToken')
56+
->willReturn($token);
57+
58+
$container = new ServiceLocator([
59+
'security.token_storage' => function () use ($usageTrackingTokenStorage): TokenStorageInterface {
60+
return $usageTrackingTokenStorage;
61+
},
62+
'request_stack' => $requestStackFactory,
63+
]);
64+
65+
$security = new Security($container);
66+
$this->assertSame($token, $security->getToken());
67+
$this->assertTrue($usageTrackingTokenStorage->isUsageTrackingEnabled());
68+
}
69+
4070
/**
4171
* @dataProvider getUserTests
4272
*/

0 commit comments

Comments
 (0)