Rework firewall access denied rule
This commit is contained in:
parent
c8d6decb61
commit
5790859275
@ -131,8 +131,6 @@ class ExceptionListener
|
|||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$event->setException($e);
|
$event->setException($e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $this->logger) {
|
if (null !== $this->logger) {
|
||||||
@ -150,7 +148,7 @@ class ExceptionListener
|
|||||||
$subRequest = $this->httpUtils->createRequest($event->getRequest(), $this->errorPage);
|
$subRequest = $this->httpUtils->createRequest($event->getRequest(), $this->errorPage);
|
||||||
$subRequest->attributes->set(Security::ACCESS_DENIED_ERROR, $exception);
|
$subRequest->attributes->set(Security::ACCESS_DENIED_ERROR, $exception);
|
||||||
|
|
||||||
$event->setResponse($event->getKernel()->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true));
|
$event->setResponse($event->getKernel()->handle($subRequest, HttpKernelInterface::SUB_REQUEST));
|
||||||
$event->allowCustomResponseCode();
|
$event->allowCustomResponseCode();
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
|
@ -130,10 +130,8 @@ class ExceptionListenerTest extends TestCase
|
|||||||
{
|
{
|
||||||
$event = $this->createEvent($exception);
|
$event = $this->createEvent($exception);
|
||||||
|
|
||||||
$accessDeniedHandler = $this->getMockBuilder('Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface')->getMock();
|
$listener = $this->createExceptionListener(null, $this->createTrustResolver(true), null, null, null, $this->createCustomAccessDeniedHandler(new Response('error')));
|
||||||
$accessDeniedHandler->expects($this->once())->method('handle')->will($this->returnValue(new Response('error')));
|
|
||||||
|
|
||||||
$listener = $this->createExceptionListener(null, $this->createTrustResolver(true), null, null, null, $accessDeniedHandler);
|
|
||||||
$listener->onKernelException($event);
|
$listener->onKernelException($event);
|
||||||
|
|
||||||
$this->assertEquals('error', $event->getResponse()->getContent());
|
$this->assertEquals('error', $event->getResponse()->getContent());
|
||||||
@ -147,16 +145,51 @@ class ExceptionListenerTest extends TestCase
|
|||||||
{
|
{
|
||||||
$event = $this->createEvent($exception);
|
$event = $this->createEvent($exception);
|
||||||
|
|
||||||
$tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock();
|
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(false), null, $this->createEntryPoint());
|
||||||
$tokenStorage->expects($this->once())->method('getToken')->will($this->returnValue($this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock()));
|
|
||||||
|
|
||||||
$listener = $this->createExceptionListener($tokenStorage, $this->createTrustResolver(false), null, $this->createEntryPoint());
|
|
||||||
$listener->onKernelException($event);
|
$listener->onKernelException($event);
|
||||||
|
|
||||||
$this->assertEquals('OK', $event->getResponse()->getContent());
|
$this->assertEquals('OK', $event->getResponse()->getContent());
|
||||||
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getAccessDeniedExceptionProvider
|
||||||
|
*/
|
||||||
|
public function testAccessDeniedExceptionNotFullFledgedAndWithAccessDeniedHandlerAndWithoutErrorPage(\Exception $exception, \Exception $eventException = null)
|
||||||
|
{
|
||||||
|
$event = $this->createEvent($exception);
|
||||||
|
|
||||||
|
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(false), null, $this->createEntryPoint(), null, $this->createCustomAccessDeniedHandler(new Response('denied', 403)));
|
||||||
|
$listener->onKernelException($event);
|
||||||
|
|
||||||
|
$this->assertEquals('denied', $event->getResponse()->getContent());
|
||||||
|
$this->assertEquals(403, $event->getResponse()->getStatusCode());
|
||||||
|
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getAccessDeniedExceptionProvider
|
||||||
|
*/
|
||||||
|
public function testAccessDeniedExceptionNotFullFledgedAndWithoutAccessDeniedHandlerAndWithErrorPage(\Exception $exception, \Exception $eventException = null)
|
||||||
|
{
|
||||||
|
$kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
|
||||||
|
$kernel->expects($this->once())->method('handle')->will($this->returnValue(new Response('Unauthorized', 401)));
|
||||||
|
|
||||||
|
$event = $this->createEvent($exception, $kernel);
|
||||||
|
|
||||||
|
$httpUtils = $this->getMockBuilder('Symfony\Component\Security\Http\HttpUtils')->getMock();
|
||||||
|
$httpUtils->expects($this->once())->method('createRequest')->will($this->returnValue(Request::create('/error')));
|
||||||
|
|
||||||
|
$listener = $this->createExceptionListener($this->createTokenStorage(), $this->createTrustResolver(true), $httpUtils, null, '/error');
|
||||||
|
$listener->onKernelException($event);
|
||||||
|
|
||||||
|
$this->assertTrue($event->isAllowingCustomResponseCode());
|
||||||
|
|
||||||
|
$this->assertEquals('Unauthorized', $event->getResponse()->getContent());
|
||||||
|
$this->assertEquals(401, $event->getResponse()->getStatusCode());
|
||||||
|
$this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
|
||||||
|
}
|
||||||
|
|
||||||
public function getAccessDeniedExceptionProvider()
|
public function getAccessDeniedExceptionProvider()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
@ -168,6 +201,22 @@ class ExceptionListenerTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function createTokenStorage()
|
||||||
|
{
|
||||||
|
$tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')->getMock();
|
||||||
|
$tokenStorage->expects($this->once())->method('getToken')->will($this->returnValue($this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')->getMock()));
|
||||||
|
|
||||||
|
return $tokenStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createCustomAccessDeniedHandler(Response $response)
|
||||||
|
{
|
||||||
|
$accessDeniedHandler = $this->getMockBuilder('Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface')->getMock();
|
||||||
|
$accessDeniedHandler->expects($this->once())->method('handle')->will($this->returnValue($response));
|
||||||
|
|
||||||
|
return $accessDeniedHandler;
|
||||||
|
}
|
||||||
|
|
||||||
private function createEntryPoint(Response $response = null)
|
private function createEntryPoint(Response $response = null)
|
||||||
{
|
{
|
||||||
$entryPoint = $this->getMockBuilder('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')->getMock();
|
$entryPoint = $this->getMockBuilder('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')->getMock();
|
||||||
|
Reference in New Issue
Block a user