[HttpKernel] Configure `session.cookie_secure` earlier

This commit is contained in:
tamcy 2021-02-19 12:13:03 +08:00 committed by Nicolas Grekas
parent 9765b5ab86
commit e82918cd60
3 changed files with 22 additions and 5 deletions

View File

@ -389,6 +389,9 @@ class NativeSessionStorage implements SessionStorageInterface
$this->emulateSameSite = $value;
continue;
}
if ('cookie_secure' === $key && 'auto' === $value) {
continue;
}
ini_set('url_rewriter.tags' !== $key ? 'session.'.$key : $key, $value);
}
}

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\HttpKernel\EventListener;
use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
/**
* Sets the session in the request.
@ -33,10 +34,12 @@ class SessionListener extends AbstractSessionListener
$this->container = $container;
}
protected function getSession(): ?SessionInterface
public function onKernelRequest(GetResponseEvent $event)
{
if (!$this->container->has('session')) {
return null;
parent::onKernelRequest($event);
if (!$event->isMasterRequest() || !$this->container->has('session')) {
return;
}
if ($this->container->has('session_storage')
@ -46,6 +49,13 @@ class SessionListener extends AbstractSessionListener
) {
$storage->setOptions(['cookie_secure' => true]);
}
}
protected function getSession(): ?SessionInterface
{
if (!$this->container->has('session')) {
return null;
}
return $this->container->get('session');
}

View File

@ -59,7 +59,7 @@ class SessionListenerTest extends TestCase
$listener = new SessionListener($container);
$event = $this->createMock(RequestEvent::class);
$event->expects($this->once())->method('isMasterRequest')->willReturn(true);
$event->expects($this->exactly(2))->method('isMasterRequest')->willReturn(true);
$event->expects($this->once())->method('getRequest')->willReturn($request);
$listener->onKernelRequest($event);
@ -203,12 +203,16 @@ class SessionListenerTest extends TestCase
$listener = new SessionListener($container);
$listener->onKernelRequest($event);
// storage->setOptions() should have been called already
$container->set('session_storage', null);
$sessionStorage = null;
$subRequest = $masterRequest->duplicate();
// at this point both master and subrequest have a closure to build the session
$masterRequest->getSession();
// calling the factory on the subRequest should not trigger a second call to storage->sesOptions()
// calling the factory on the subRequest should not trigger a second call to storage->setOptions()
$subRequest->getSession();
}
}