Skip to content

Commit aaa9392

Browse files
symfonyamlNyholm
authored andcommitted
[SecurityBundle] Prevent to login/logout without a request context
1 parent 6a9f47c commit aaa9392

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

src/Symfony/Bundle/SecurityBundle/Security.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public function getFirewallConfig(Request $request): ?FirewallConfig
6060
public function login(UserInterface $user, string $authenticatorName = null, string $firewallName = null): void
6161
{
6262
$request = $this->container->get('request_stack')->getCurrentRequest();
63+
if (null === $request) {
64+
throw new LogicException('Unable to login without a request context.');
65+
}
66+
6367
$firewallName ??= $this->getFirewallConfig($request)?->getName();
6468

6569
if (!$firewallName) {
@@ -83,15 +87,18 @@ public function login(UserInterface $user, string $authenticatorName = null, str
8387
*/
8488
public function logout(bool $validateCsrfToken = true): ?Response
8589
{
90+
$request = $this->container->get('request_stack')->getMainRequest();
91+
if (null === $request) {
92+
throw new LogicException('Unable to logout without a request context.');
93+
}
94+
8695
/** @var TokenStorageInterface $tokenStorage */
8796
$tokenStorage = $this->container->get('security.token_storage');
8897

8998
if (!($token = $tokenStorage->getToken()) || !$token->getUser()) {
9099
throw new LogicException('Unable to logout as there is no logged-in user.');
91100
}
92101

93-
$request = $this->container->get('request_stack')->getMainRequest();
94-
95102
if (!$firewallConfig = $this->container->get('security.firewall.map')->getFirewallConfig($request)) {
96103
throw new LogicException('Unable to logout as the request is not behind a firewall.');
97104
}

src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,28 @@ public function testLoginWithoutAuthenticatorThrows()
201201
$security->login($user);
202202
}
203203

204+
public function testLoginWithoutRequestContext()
205+
{
206+
$requestStack = new RequestStack();
207+
$user = $this->createMock(UserInterface::class);
208+
209+
$container = $this->createMock(ContainerInterface::class);
210+
$container
211+
->expects($this->atLeastOnce())
212+
->method('get')
213+
->willReturnMap([
214+
['request_stack', $requestStack],
215+
])
216+
;
217+
218+
$security = new Security($container, ['main' => null]);
219+
220+
$this->expectException(\LogicException::class);
221+
$this->expectExceptionMessage('Unable to login without a request context.');
222+
223+
$security->login($user);
224+
}
225+
204226
public function testLogout()
205227
{
206228
$request = new Request();
@@ -407,6 +429,27 @@ public function testLogoutWithValidCsrf()
407429
$this->assertEquals('a custom response', $response->getContent());
408430
}
409431

432+
public function testLogoutWithoutRequestContext()
433+
{
434+
$requestStack = new RequestStack();
435+
436+
$container = $this->createMock(ContainerInterface::class);
437+
$container
438+
->expects($this->atLeastOnce())
439+
->method('get')
440+
->willReturnMap([
441+
['request_stack', $requestStack],
442+
])
443+
;
444+
445+
$security = new Security($container, ['main' => null]);
446+
447+
$this->expectException(\LogicException::class);
448+
$this->expectExceptionMessage('Unable to logout without a request context.');
449+
450+
$security->logout();
451+
}
452+
410453
private function createContainer(string $serviceId, object $serviceObject): ContainerInterface
411454
{
412455
return new ServiceLocator([$serviceId => fn () => $serviceObject]);

0 commit comments

Comments
 (0)