From 0ac530f4608aa773f7db2749a3ec53cdfccaf0a6 Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Sun, 31 May 2020 23:35:18 +0200 Subject: [PATCH] Also check PUBLIC_ACCESS for authenticated tokens Currently, authenticated users are denied access for pages that have PUBLIC_ACCESS, as this attribute is only checked when no token was set. --- .../Security/Http/Firewall/AccessListener.php | 8 +++-- .../Tests/Firewall/AccessListenerTest.php | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Security/Http/Firewall/AccessListener.php b/src/Symfony/Component/Security/Http/Firewall/AccessListener.php index 8da2a994bf48..b218e1086c62 100644 --- a/src/Symfony/Component/Security/Http/Firewall/AccessListener.php +++ b/src/Symfony/Component/Security/Http/Firewall/AccessListener.php @@ -95,11 +95,13 @@ public function authenticate(RequestEvent $event) return; } - if ([self::PUBLIC_ACCESS] === $attributes) { - return; + if ([self::PUBLIC_ACCESS] !== $attributes) { + throw $this->createAccessDeniedException($request, $attributes); } + } - throw $this->createAccessDeniedException($request, $attributes); + if ([self::PUBLIC_ACCESS] === $attributes) { + return; } if (!$token->isAuthenticated()) { diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php index 9748e6522c6a..154addc7c409 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php @@ -18,8 +18,10 @@ use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; +use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; +use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Http\AccessMapInterface; use Symfony\Component\Security\Http\Event\LazyResponseEvent; use Symfony\Component\Security\Http\Firewall\AccessListener; @@ -279,6 +281,33 @@ public function testHandleWhenPublicAccessIsAllowedAndExceptionOnTokenIsFalse() $this->expectNotToPerformAssertions(); } + public function testHandleWhenPublicAccessWhileAuthenticated() + { + $token = new UsernamePasswordToken(new User('Wouter', null, ['ROLE_USER']), null, 'main', ['ROLE_USER']); + $tokenStorage = new TokenStorage(); + $tokenStorage->setToken($token); + $request = new Request(); + + $accessMap = $this->createMock(AccessMapInterface::class); + $accessMap->expects($this->any()) + ->method('getPatterns') + ->with($this->equalTo($request)) + ->willReturn([[AccessListener::PUBLIC_ACCESS], null]) + ; + + $listener = new AccessListener( + $tokenStorage, + $this->getMockBuilder('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface')->getMock(), + $accessMap, + $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface')->getMock(), + false + ); + + $listener(new RequestEvent($this->createMock(HttpKernelInterface::class), $request, HttpKernelInterface::MASTER_REQUEST)); + + $this->expectNotToPerformAssertions(); + } + public function testHandleMWithultipleAttributesShouldBeHandledAsAnd() { $request = new Request();