Skip to content

Commit 75e96df

Browse files
Merge branch '3.4' into 4.3
* 3.4: [Security] Fix clearing remember-me cookie after deauthentication more robust initialization from request
2 parents 4fb6913 + 2ddb064 commit 75e96df

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

Firewall/ContextListener.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use Symfony\Component\Security\Core\User\UserInterface;
3131
use Symfony\Component\Security\Core\User\UserProviderInterface;
3232
use Symfony\Component\Security\Http\Event\DeauthenticatedEvent;
33+
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
3334

3435
/**
3536
* ContextListener manages the SecurityContext persistence through a session.
@@ -50,6 +51,7 @@ class ContextListener implements ListenerInterface
5051
private $dispatcher;
5152
private $registered;
5253
private $trustResolver;
54+
private $rememberMeServices;
5355

5456
/**
5557
* @param iterable|UserProviderInterface[] $userProviders
@@ -110,6 +112,10 @@ public function __invoke(RequestEvent $event)
110112

111113
if ($token instanceof TokenInterface) {
112114
$token = $this->refreshUser($token);
115+
116+
if (!$token && $this->rememberMeServices) {
117+
$this->rememberMeServices->loginFail($request);
118+
}
113119
} elseif (null !== $token) {
114120
if (null !== $this->logger) {
115121
$this->logger->warning('Expected a security token from the session, got something else.', ['key' => $this->sessionKey, 'received' => $token]);
@@ -278,4 +284,9 @@ public static function handleUnserializeCallback($class)
278284
{
279285
throw new \ErrorException('Class not found: '.$class, 0x37313bc);
280286
}
287+
288+
public function setRememberMeServices(RememberMeServicesInterface $rememberMeServices)
289+
{
290+
$this->rememberMeServices = $rememberMeServices;
291+
}
281292
}

Tests/Firewall/ContextListenerTest.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use Symfony\Component\Security\Core\User\UserProviderInterface;
3434
use Symfony\Component\Security\Http\Event\DeauthenticatedEvent;
3535
use Symfony\Component\Security\Http\Firewall\ContextListener;
36+
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
3637

3738
class ContextListenerTest extends TestCase
3839
{
@@ -263,10 +264,23 @@ public function testIfTokenIsNotDeauthenticated()
263264
$tokenStorage = new TokenStorage();
264265
$badRefreshedUser = new User('foobar', 'baz');
265266
$goodRefreshedUser = new User('foobar', 'bar');
266-
$this->handleEventWithPreviousSession($tokenStorage, [new SupportingUserProvider($badRefreshedUser), new SupportingUserProvider($goodRefreshedUser)], $goodRefreshedUser, true);
267+
$this->handleEventWithPreviousSession($tokenStorage, [new SupportingUserProvider($badRefreshedUser), new SupportingUserProvider($goodRefreshedUser)], $goodRefreshedUser);
267268
$this->assertSame($goodRefreshedUser, $tokenStorage->getToken()->getUser());
268269
}
269270

271+
public function testRememberMeGetsCanceledIfTokenIsDeauthenticated()
272+
{
273+
$tokenStorage = new TokenStorage();
274+
$refreshedUser = new User('foobar', 'baz');
275+
276+
$rememberMeServices = $this->createMock(RememberMeServicesInterface::class);
277+
$rememberMeServices->expects($this->once())->method('loginFail');
278+
279+
$this->handleEventWithPreviousSession($tokenStorage, [new NotSupportingUserProvider(), new SupportingUserProvider($refreshedUser)], null, $rememberMeServices);
280+
281+
$this->assertNull($tokenStorage->getToken());
282+
}
283+
270284
public function testTryAllUserProvidersUntilASupportingUserProviderIsFound()
271285
{
272286
$tokenStorage = new TokenStorage();
@@ -363,7 +377,7 @@ protected function runSessionOnKernelResponse($newToken, $original = null)
363377
return $session;
364378
}
365379

366-
private function handleEventWithPreviousSession(TokenStorageInterface $tokenStorage, $userProviders, UserInterface $user = null)
380+
private function handleEventWithPreviousSession(TokenStorageInterface $tokenStorage, $userProviders, UserInterface $user = null, RememberMeServicesInterface $rememberMeServices = null)
367381
{
368382
$user = $user ?: new User('foo', 'bar');
369383
$session = new Session(new MockArraySessionStorage());
@@ -374,6 +388,10 @@ private function handleEventWithPreviousSession(TokenStorageInterface $tokenStor
374388
$request->cookies->set('MOCKSESSID', true);
375389

376390
$listener = new ContextListener($tokenStorage, $userProviders, 'context_key');
391+
392+
if ($rememberMeServices) {
393+
$listener->setRememberMeServices($rememberMeServices);
394+
}
377395
$listener(new RequestEvent($this->getMockBuilder(HttpKernelInterface::class)->getMock(), $request, HttpKernelInterface::MASTER_REQUEST));
378396
}
379397
}

0 commit comments

Comments
 (0)