diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml index f6dd2bb9df630..58882f2643103 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml @@ -75,6 +75,7 @@ %kernel.debug% %kernel.charset% %debug.file_link_format% + diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index f0d8c0dc5a526..e8a12d82c7d9d 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -19,6 +19,7 @@ use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Argument\IteratorArgument; use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; @@ -28,6 +29,9 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; use Symfony\Component\Security\Core\Encoder\Argon2iPasswordEncoder; +use Symfony\Component\Security\Core\Exception\AccessDeniedException; +use Symfony\Component\Security\Core\Exception\AuthenticationException; +use Symfony\Component\Security\Core\Exception\LogoutException; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Controller\UserValueResolver; @@ -37,7 +41,7 @@ * @author Fabien Potencier * @author Johannes M. Schmitt */ -class SecurityExtension extends Extension +class SecurityExtension extends Extension implements CompilerPassInterface { private $requestMatchers = array(); private $expressions = array(); @@ -121,6 +125,21 @@ public function load(array $configs, ContainerBuilder $container) ->addTag('security.voter'); } + public function process(ContainerBuilder $container) + { + $silentExceptions = array( + AuthenticationException::class, + AccessDeniedException::class, + LogoutException::class, + ); + if ($container->hasDefinition('http_exception_listener') && 6 === count(($definition = $container->getDefinition('http_exception_listener'))->getArguments())) { + $definition->replaceArgument(5, array_merge($definition->getArgument(5), $silentExceptions)); + } + if ($container->hasDefinition('twig.exception_listener') && 6 === count(($definition = $container->getDefinition('twig.exception_listener'))->getArguments())) { + $definition->replaceArgument(5, array_merge($definition->getArgument(5), $silentExceptions)); + } + } + private function createRoleHierarchy(array $config, ContainerBuilder $container) { if (!isset($config['role_hierarchy']) || 0 === count($config['role_hierarchy'])) { diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml index fca4367ba743c..9ec691c2f42d5 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml @@ -129,6 +129,9 @@ %twig.exception_listener.controller% %kernel.debug% + %kernel.charset% + %debug.file_link_format% + diff --git a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php index 430a6f9196951..be26581856af0 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php @@ -37,20 +37,28 @@ class ExceptionListener implements EventSubscriberInterface protected $debug; private $charset; private $fileLinkFormat; + private $silentIgnore; - public function __construct($controller, LoggerInterface $logger = null, $debug = false, $charset = null, $fileLinkFormat = null) + public function __construct($controller, LoggerInterface $logger = null, $debug = false, $charset = null, $fileLinkFormat = null, array $silentIgnore = array()) { $this->controller = $controller; $this->logger = $logger; $this->debug = $debug; $this->charset = $charset; $this->fileLinkFormat = $fileLinkFormat; + $this->silentIgnore = $silentIgnore; } public function logKernelException(GetResponseForExceptionEvent $event) { - $exception = $event->getException(); - $request = $event->getRequest(); + $exception = $prev = $event->getException(); + do { + foreach ($this->silentIgnore as $class) { + if ($prev instanceof $class) { + return; + } + } + } while (null !== $prev = $exception->getPrevious()); $this->logException($exception, sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine())); }