Skip to content

Commit 4fc6568

Browse files
committed
[Security] Add an easier way to get the current firewall configuration
1 parent 88e6a49 commit 4fc6568

File tree

5 files changed

+42
-1
lines changed

5 files changed

+42
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add the `Security` helper class
88
* Deprecate the `Symfony\Component\Security\Core\Security` service alias, use `Symfony\Bundle\SecurityBundle\Security\Security` instead
9+
* Add `Security::getFirewallConfig()` to help to get the firewall configuration associated to the Request
910

1011
6.1
1112
---

Resources/config/security.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
->args([service_locator([
8181
'security.token_storage' => service('security.token_storage'),
8282
'security.authorization_checker' => service('security.authorization_checker'),
83+
'security.firewall.map' => service('security.firewall.map'),
8384
])])
8485
->alias(Security::class, 'security.helper')
8586
->alias(LegacySecurity::class, 'security.helper')

Security/Security.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bundle\SecurityBundle\Security;
1313

1414
use Psr\Container\ContainerInterface;
15+
use Symfony\Component\HttpFoundation\Request;
1516
use Symfony\Component\Security\Core\Security as LegacySecurity;
1617

1718
/**
@@ -21,8 +22,13 @@
2122
*/
2223
class Security extends LegacySecurity
2324
{
24-
public function __construct(ContainerInterface $container)
25+
public function __construct(private ContainerInterface $container)
2526
{
2627
parent::__construct($container, false);
2728
}
29+
30+
public function getFirewallConfig(Request $request): ?FirewallConfig
31+
{
32+
return $this->container->get('security.firewall.map')->getFirewallConfig($request);
33+
}
2834
}

Tests/Functional/SecurityTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Bundle\SecurityBundle\Tests\Functional;
1313

14+
use Symfony\Bundle\SecurityBundle\Security\FirewallConfig;
1415
use Symfony\Bundle\SecurityBundle\Tests\Functional\Bundle\SecuredPageBundle\Security\Core\User\ArrayUserProvider;
16+
use Symfony\Component\HttpFoundation\Request;
1517
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
1618
use Symfony\Component\Security\Core\User\InMemoryUser;
1719
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
@@ -33,6 +35,8 @@ public function testServiceIsFunctional()
3335
$security = $container->get('functional_test.security.helper');
3436
$this->assertTrue($security->isGranted('ROLE_USER'));
3537
$this->assertSame($token, $security->getToken());
38+
$this->assertInstanceOf(FirewallConfig::class, $firewallConfig = $security->getFirewallConfig(new Request()));
39+
$this->assertSame('default', $firewallConfig->getName());
3640
}
3741

3842
/**

Tests/Security/SecurityTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Psr\Container\ContainerInterface;
16+
use Symfony\Bundle\SecurityBundle\Security\FirewallConfig;
17+
use Symfony\Bundle\SecurityBundle\Security\FirewallMap;
1618
use Symfony\Bundle\SecurityBundle\Security\Security;
1719
use Symfony\Component\DependencyInjection\ServiceLocator;
20+
use Symfony\Component\HttpFoundation\Request;
1821
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
1922
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
2023
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
@@ -82,6 +85,32 @@ public function testIsGranted()
8285
$this->assertTrue($security->isGranted('SOME_ATTRIBUTE', 'SOME_SUBJECT'));
8386
}
8487

88+
/**
89+
* @dataProvider getFirewallConfigTests
90+
*/
91+
public function testGetFirewallConfig(Request $request, ?FirewallConfig $expectedFirewallConfig)
92+
{
93+
$firewallMap = $this->createMock(FirewallMap::class);
94+
95+
$firewallMap->expects($this->once())
96+
->method('getFirewallConfig')
97+
->with($request)
98+
->willReturn($expectedFirewallConfig);
99+
100+
$container = $this->createContainer('security.firewall.map', $firewallMap);
101+
102+
$security = new \Symfony\Component\Security\Core\Security($container);
103+
$this->assertSame($expectedFirewallConfig, $security->getFirewallConfig($request));
104+
}
105+
106+
public function getFirewallConfigTests()
107+
{
108+
$request = new Request();
109+
110+
yield [$request, null];
111+
yield [$request, new FirewallConfig('main', 'acme_user_checker')];
112+
}
113+
85114
private function createContainer(string $serviceId, object $serviceObject): ContainerInterface
86115
{
87116
return new ServiceLocator([$serviceId => fn () => $serviceObject]);

0 commit comments

Comments
 (0)