Skip to content

Commit 183ee91

Browse files
committed
Make symfony/security-acl integration optional
1 parent 7325882 commit 183ee91

10 files changed

Lines changed: 243 additions & 133 deletions

File tree

UPGRADE-4.x.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
UPGRADE 4.x
22
===========
33

4+
UPGRADE FROM 4.41 to 4.42
5+
=========================
6+
7+
## Optional Symfony ACL integration
8+
9+
Before 4.42.0 the `symfony/security-acl` package was a hard dependency even if no ACL features were used.
10+
Starting with 4.42.0 the dependency is now optional and users who are using ACL features should not be impacted as they
11+
also need to have `symfony/acl-bundle` installed anyway (which requires `symfony/security-acl`).
12+
13+
In case `symfony/security-acl` is not installed we are now also skipping registration of some ACL related services.
14+
415
UPGRADE FROM 4.18 to 4.19
516
=========================
617

composer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
"symfony/options-resolver": "^6.4 || ^7.3 || ^8.0",
5353
"symfony/property-access": "^6.4 || ^7.3 || ^8.0",
5454
"symfony/routing": "^6.4 || ^7.3 || ^8.0",
55-
"symfony/security-acl": "^3.1",
5655
"symfony/security-bundle": "^6.4 || ^7.3 || ^8.0",
5756
"symfony/security-core": "^6.4 || ^7.3 || ^8.0",
5857
"symfony/security-csrf": "^6.4 || ^7.3 || ^8.0",
@@ -85,8 +84,12 @@
8584
"symfony/css-selector": "^6.4 || ^7.3 || ^8.0",
8685
"symfony/filesystem": "^6.4 || ^7.3 || ^8.0",
8786
"symfony/maker-bundle": "^1.25",
87+
"symfony/security-acl": "^3.1",
8888
"symfony/yaml": "^6.4 || ^7.3 || ^8.0"
8989
},
90+
"conflict": {
91+
"symfony/security-acl": "<3.1 >=4.0"
92+
},
9093
"suggest": {
9194
"twig/extra-bundle": "Auto configures the Twig Intl extension"
9295
},

src/Admin/AbstractAdmin.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,36 @@
4848
use Symfony\Component\Security\Acl\Model\DomainObjectInterface;
4949
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
5050

51+
if (interface_exists(DomainObjectInterface::class)) {
52+
/**
53+
* @internal
54+
*
55+
* @phpstan-template T of object
56+
* @phpstan-extends AbstractTaggedAdmin<T>
57+
*/
58+
abstract class BaseAbstractAdmin extends AbstractTaggedAdmin implements DomainObjectInterface
59+
{
60+
}
61+
} else {
62+
/**
63+
* @internal
64+
*
65+
* @phpstan-template T of object
66+
* @phpstan-extends AbstractTaggedAdmin<T>
67+
*/
68+
abstract class BaseAbstractAdmin extends AbstractTaggedAdmin
69+
{
70+
}
71+
}
72+
5173
/**
5274
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
5375
*
5476
* @phpstan-template T of object
55-
* @phpstan-extends AbstractTaggedAdmin<T>
77+
* @phpstan-extends BaseAbstractAdmin<T>
5678
* @phpstan-implements AdminInterface<T>
5779
*/
58-
abstract class AbstractAdmin extends AbstractTaggedAdmin implements AdminInterface, DomainObjectInterface, AdminTreeInterface
80+
abstract class AbstractAdmin extends BaseAbstractAdmin implements AdminInterface, AdminTreeInterface
5981
{
6082
// NEXT_MAJOR: Remove the CONTEXT constants.
6183
/** @deprecated */

src/Controller/CRUDController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public static function getSubscribedServices(): array
8585
return [
8686
'sonata.admin.pool' => Pool::class,
8787
'sonata.admin.audit.manager' => AuditManagerInterface::class,
88-
'sonata.admin.object.manipulator.acl.admin' => AdminObjectAclManipulator::class,
88+
'sonata.admin.object.manipulator.acl.admin' => '?'.AdminObjectAclManipulator::class,
8989
'sonata.admin.request.fetcher' => AdminFetcherInterface::class,
9090
'sonata.exporter.exporter' => '?'.ExporterInterface::class,
9191
'sonata.admin.admin_exporter' => '?'.AdminExporter::class,

src/DependencyInjection/Compiler/ObjectAclManipulatorCompilerPass.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ final class ObjectAclManipulatorCompilerPass implements CompilerPassInterface
2828
{
2929
public function process(ContainerBuilder $container): void
3030
{
31+
if (!$container->has('sonata.admin.command.generate_object_acl')) {
32+
return;
33+
}
34+
3135
$availableManagers = [];
3236

3337
foreach ($container->getServiceIds() as $id) {

src/DependencyInjection/SonataAdminExtension.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use Symfony\Component\Form\Extension\Core\Type\IntegerType as SymfonyIntegerType;
3131
use Symfony\Component\Form\Extension\Core\Type\TextareaType as SymfonyTextareaType;
3232
use Symfony\Component\Form\Extension\Core\Type\TextType as SymfonyTextType;
33+
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
3334

3435
/**
3536
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
@@ -184,6 +185,11 @@ public function load(array $configs, ContainerBuilder $container): void
184185

185186
$loader->load('security.php');
186187

188+
if (interface_exists(ObjectIdentityInterface::class)) {
189+
// only load this in case the optional symfony/security-acl package is installed
190+
$loader->load('acl.php');
191+
}
192+
187193
$container->setParameter('sonata.admin.extension.map', $config['extensions']);
188194

189195
/*

src/Resources/config/acl.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the Sonata Project package.
7+
*
8+
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
9+
*
10+
* For the full copyright and license information, please view the LICENSE
11+
* file that was distributed with this source code.
12+
*/
13+
14+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
15+
16+
use Sonata\AdminBundle\Command\GenerateObjectAclCommand;
17+
use Sonata\AdminBundle\Command\SetupAclCommand;
18+
use Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder;
19+
use Sonata\AdminBundle\Security\Handler\AclSecurityHandler;
20+
use Sonata\AdminBundle\Util\AdminAclManipulator;
21+
use Sonata\AdminBundle\Util\AdminObjectAclManipulator;
22+
23+
return static function (ContainerConfigurator $containerConfigurator): void {
24+
$containerConfigurator->parameters()
25+
->set('sonata.admin.security.handler.acl.class', AclSecurityHandler::class)
26+
27+
->set('sonata.admin.security.mask.builder.class', MaskBuilder::class)
28+
29+
->set('sonata.admin.manipulator.acl.admin.class', AdminAclManipulator::class)
30+
31+
->set('sonata.admin.object.manipulator.acl.admin.class', AdminObjectAclManipulator::class);
32+
33+
$containerConfigurator->services()
34+
->set('sonata.admin.command.generate_object_acl', GenerateObjectAclCommand::class)
35+
->tag('console.command')
36+
->args([
37+
service('sonata.admin.pool'),
38+
abstract_arg('acl object manipulators'),
39+
])
40+
41+
->set('sonata.admin.command.setup_acl', SetupAclCommand::class)
42+
->tag('console.command')
43+
->args([
44+
service('sonata.admin.pool'),
45+
service('sonata.admin.manipulator.acl.admin'),
46+
])
47+
48+
->set('sonata.admin.security.handler.acl', (string) param('sonata.admin.security.handler.acl.class'))
49+
->args([
50+
service('security.token_storage'),
51+
service('security.authorization_checker'),
52+
service('security.acl.provider')->nullOnInvalid(),
53+
param('sonata.admin.security.mask.builder.class'),
54+
param('sonata.admin.configuration.security.role_super_admin'),
55+
])
56+
->call('setAdminPermissions', [param('sonata.admin.configuration.security.admin_permissions')])
57+
->call('setObjectPermissions', [param('sonata.admin.configuration.security.object_permissions')])
58+
59+
->set('sonata.admin.manipulator.acl.admin', (string) param('sonata.admin.manipulator.acl.admin.class'))
60+
->args([
61+
param('sonata.admin.security.mask.builder.class'),
62+
])
63+
64+
->set('sonata.admin.object.manipulator.acl.admin', (string) param('sonata.admin.object.manipulator.acl.admin.class'))
65+
->args([
66+
service('form.factory'),
67+
param('sonata.admin.security.mask.builder.class'),
68+
])
69+
70+
->alias(AdminObjectAclManipulator::class, 'sonata.admin.object.manipulator.acl.admin');
71+
};

src/Resources/config/commands.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
1515

1616
use Sonata\AdminBundle\Command\ExplainAdminCommand;
17-
use Sonata\AdminBundle\Command\GenerateObjectAclCommand;
1817
use Sonata\AdminBundle\Command\ListAdminCommand;
19-
use Sonata\AdminBundle\Command\SetupAclCommand;
2018

2119
return static function (ContainerConfigurator $containerConfigurator): void {
2220
$containerConfigurator->services()
@@ -27,23 +25,9 @@
2725
service('sonata.admin.pool'),
2826
])
2927

30-
->set('sonata.admin.command.generate_object_acl', GenerateObjectAclCommand::class)
31-
->tag('console.command')
32-
->args([
33-
service('sonata.admin.pool'),
34-
abstract_arg('acl object manipulators'),
35-
])
36-
3728
->set('sonata.admin.command.list', ListAdminCommand::class)
3829
->tag('console.command')
3930
->args([
4031
service('sonata.admin.pool'),
41-
])
42-
43-
->set('sonata.admin.command.setup_acl', SetupAclCommand::class)
44-
->tag('console.command')
45-
->args([
46-
service('sonata.admin.pool'),
47-
service('sonata.admin.manipulator.acl.admin'),
4832
]);
4933
};

src/Resources/config/security.php

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,15 @@
1313

1414
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
1515

16-
use Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder;
17-
use Sonata\AdminBundle\Security\Handler\AclSecurityHandler;
1816
use Sonata\AdminBundle\Security\Handler\NoopSecurityHandler;
1917
use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler;
20-
use Sonata\AdminBundle\Util\AdminAclManipulator;
21-
use Sonata\AdminBundle\Util\AdminObjectAclManipulator;
2218

2319
return static function (ContainerConfigurator $containerConfigurator): void {
2420
$containerConfigurator->parameters()
2521

2622
->set('sonata.admin.security.handler.noop.class', NoopSecurityHandler::class)
2723

28-
->set('sonata.admin.security.handler.role.class', RoleSecurityHandler::class)
29-
30-
->set('sonata.admin.security.handler.acl.class', AclSecurityHandler::class)
31-
32-
->set('sonata.admin.security.mask.builder.class', MaskBuilder::class)
33-
34-
->set('sonata.admin.manipulator.acl.admin.class', AdminAclManipulator::class)
35-
36-
->set('sonata.admin.object.manipulator.acl.admin.class', AdminObjectAclManipulator::class);
24+
->set('sonata.admin.security.handler.role.class', RoleSecurityHandler::class);
3725

3826
$containerConfigurator->services()
3927

@@ -43,29 +31,5 @@
4331
->args([
4432
service('security.authorization_checker'),
4533
param('sonata.admin.configuration.security.role_super_admin'),
46-
])
47-
48-
->set('sonata.admin.security.handler.acl', (string) param('sonata.admin.security.handler.acl.class'))
49-
->args([
50-
service('security.token_storage'),
51-
service('security.authorization_checker'),
52-
service('security.acl.provider')->nullOnInvalid(),
53-
param('sonata.admin.security.mask.builder.class'),
54-
param('sonata.admin.configuration.security.role_super_admin'),
55-
])
56-
->call('setAdminPermissions', [param('sonata.admin.configuration.security.admin_permissions')])
57-
->call('setObjectPermissions', [param('sonata.admin.configuration.security.object_permissions')])
58-
59-
->set('sonata.admin.manipulator.acl.admin', (string) param('sonata.admin.manipulator.acl.admin.class'))
60-
->args([
61-
param('sonata.admin.security.mask.builder.class'),
62-
])
63-
64-
->set('sonata.admin.object.manipulator.acl.admin', (string) param('sonata.admin.object.manipulator.acl.admin.class'))
65-
->args([
66-
service('form.factory'),
67-
param('sonata.admin.security.mask.builder.class'),
68-
])
69-
70-
->alias(AdminObjectAclManipulator::class, 'sonata.admin.object.manipulator.acl.admin');
34+
]);
7135
};

0 commit comments

Comments
 (0)