2010-10-19 12:06:43 +01:00
|
|
|
<?php
|
|
|
|
|
2011-01-15 13:29:43 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the Symfony package.
|
|
|
|
*
|
2011-03-06 11:40:06 +00:00
|
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
2011-01-15 13:29:43 +00:00
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
2011-01-26 20:34:11 +00:00
|
|
|
namespace Symfony\Component\Security\Http;
|
2010-10-19 12:06:43 +01:00
|
|
|
|
2011-03-13 18:16:56 +00:00
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
2012-11-06 10:06:32 +00:00
|
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
2018-07-26 10:03:18 +01:00
|
|
|
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
|
|
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
|
|
|
use Symfony\Component\HttpKernel\KernelEvents;
|
2010-10-19 12:06:43 +01:00
|
|
|
|
|
|
|
/**
|
2010-10-23 09:42:49 +01:00
|
|
|
* Firewall uses a FirewallMap to register security listeners for the given
|
|
|
|
* request.
|
2010-10-19 12:06:43 +01:00
|
|
|
*
|
|
|
|
* It allows for different security strategies within the same application
|
2010-10-23 09:42:49 +01:00
|
|
|
* (a Basic authentication for the /api, and a web based authentication for
|
|
|
|
* everything else for instance).
|
2010-10-19 12:06:43 +01:00
|
|
|
*
|
2011-03-06 11:40:06 +00:00
|
|
|
* @author Fabien Potencier <fabien@symfony.com>
|
2010-10-19 12:06:43 +01:00
|
|
|
*/
|
2012-11-06 10:06:32 +00:00
|
|
|
class Firewall implements EventSubscriberInterface
|
2010-10-19 12:06:43 +01:00
|
|
|
{
|
2011-03-07 17:17:46 +00:00
|
|
|
private $map;
|
2011-03-13 18:16:56 +00:00
|
|
|
private $dispatcher;
|
2013-09-08 14:07:37 +01:00
|
|
|
private $exceptionListeners;
|
2010-10-19 12:06:43 +01:00
|
|
|
|
2011-03-13 18:16:56 +00:00
|
|
|
public function __construct(FirewallMapInterface $map, EventDispatcherInterface $dispatcher)
|
2010-10-19 12:06:43 +01:00
|
|
|
{
|
|
|
|
$this->map = $map;
|
2011-03-13 18:16:56 +00:00
|
|
|
$this->dispatcher = $dispatcher;
|
2013-09-08 14:07:37 +01:00
|
|
|
$this->exceptionListeners = new \SplObjectStorage();
|
2010-10-19 12:06:43 +01:00
|
|
|
}
|
|
|
|
|
2011-06-21 15:34:33 +01:00
|
|
|
public function onKernelRequest(GetResponseEvent $event)
|
2010-10-19 12:06:43 +01:00
|
|
|
{
|
2013-08-08 22:41:21 +01:00
|
|
|
if (!$event->isMasterRequest()) {
|
2010-10-19 12:06:43 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-12-03 17:47:54 +00:00
|
|
|
// register listeners for this firewall
|
2018-05-11 19:46:08 +01:00
|
|
|
$listeners = $this->map->getListeners($event->getRequest());
|
|
|
|
|
|
|
|
$authenticationListeners = $listeners[0];
|
|
|
|
$exceptionListener = $listeners[1];
|
|
|
|
$logoutListener = isset($listeners[2]) ? $listeners[2] : null;
|
|
|
|
|
2014-03-09 11:57:49 +00:00
|
|
|
if (null !== $exceptionListener) {
|
|
|
|
$this->exceptionListeners[$event->getRequest()] = $exceptionListener;
|
|
|
|
$exceptionListener->register($this->dispatcher);
|
2010-10-19 12:06:43 +01:00
|
|
|
}
|
|
|
|
|
2010-12-03 17:47:54 +00:00
|
|
|
// initiate the listener chain
|
2018-05-11 19:46:08 +01:00
|
|
|
foreach ($authenticationListeners as $listener) {
|
2013-03-28 17:41:24 +00:00
|
|
|
$listener->handle($event);
|
2010-10-19 12:06:43 +01:00
|
|
|
|
2011-03-13 18:16:56 +00:00
|
|
|
if ($event->hasResponse()) {
|
2011-03-13 17:10:39 +00:00
|
|
|
break;
|
2011-03-11 00:43:22 +00:00
|
|
|
}
|
2010-10-19 12:06:43 +01:00
|
|
|
}
|
2018-05-11 19:46:08 +01:00
|
|
|
|
|
|
|
if (null !== $logoutListener) {
|
|
|
|
$logoutListener->handle($event);
|
|
|
|
}
|
2010-10-19 12:06:43 +01:00
|
|
|
}
|
2012-11-06 10:06:32 +00:00
|
|
|
|
2013-09-08 14:07:37 +01:00
|
|
|
public function onKernelFinishRequest(FinishRequestEvent $event)
|
|
|
|
{
|
|
|
|
$request = $event->getRequest();
|
|
|
|
|
|
|
|
if (isset($this->exceptionListeners[$request])) {
|
|
|
|
$this->exceptionListeners[$request]->unregister($this->dispatcher);
|
|
|
|
unset($this->exceptionListeners[$request]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-21 23:25:28 +01:00
|
|
|
/**
|
2014-04-15 06:57:34 +01:00
|
|
|
* {@inheritdoc}
|
2013-08-21 23:25:28 +01:00
|
|
|
*/
|
2012-11-06 10:06:32 +00:00
|
|
|
public static function getSubscribedEvents()
|
|
|
|
{
|
2013-09-08 14:07:37 +01:00
|
|
|
return array(
|
|
|
|
KernelEvents::REQUEST => array('onKernelRequest', 8),
|
|
|
|
KernelEvents::FINISH_REQUEST => 'onKernelFinishRequest',
|
|
|
|
);
|
2012-11-06 10:06:32 +00:00
|
|
|
}
|
2010-10-19 12:06:43 +01:00
|
|
|
}
|