Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 2 additions & 34 deletions src/Resources/config/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,48 +13,16 @@

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Sonata\UserBundle\Form\Type\RolesMatrixType;
use Sonata\UserBundle\Security\RolesBuilder\AdminRolesBuilder;
use Sonata\UserBundle\Security\RolesBuilder\MatrixRolesBuilder;
use Sonata\UserBundle\Security\RolesBuilder\SecurityRolesBuilder;
use Sonata\UserBundle\Twig\RolesMatrixExtension;

return static function (ContainerConfigurator $containerConfigurator): void {
$containerConfigurator->services()

->set('sonata.user.matrix_roles_builder', MatrixRolesBuilder::class)
->args([
service('security.token_storage'),
service('sonata.user.admin_roles_builder'),
service('sonata.user.security_roles_builder'),
])

->set('sonata.user.admin_roles_builder', AdminRolesBuilder::class)
->args([
service('security.authorization_checker'),
service('sonata.admin.pool'),
service('sonata.admin.configuration'),
service('translator'),
])

->set('sonata.user.security_roles_builder', SecurityRolesBuilder::class)
->args([
service('security.authorization_checker'),
service('sonata.admin.configuration'),
service('sonata.admin.pool')->nullOnInvalid(),
service('sonata.admin.configuration')->nullOnInvalid(),
service('translator'),
param('security.role_hierarchy.roles'),
])

->set('sonata.user.form.roles_matrix_type', RolesMatrixType::class)
->public()
->tag('form.type')
->args([
service('sonata.user.matrix_roles_builder'),
])

->set('sonata.user.roles_matrix_extension', RolesMatrixExtension::class)
->tag('twig.extension')
->args([
service('sonata.user.matrix_roles_builder'),
]);
};
27 changes: 26 additions & 1 deletion src/Resources/config/form.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

use Sonata\UserBundle\Form\Type\ResetPasswordRequestFormType;
use Sonata\UserBundle\Form\Type\ResettingFormType;
use Sonata\UserBundle\Form\Type\RolesMatrixType;
use Sonata\UserBundle\Security\RolesBuilder\MatrixRolesBuilder;
use Sonata\UserBundle\Security\RolesBuilder\SecurityRolesBuilder;

return static function (ContainerConfigurator $containerConfigurator): void {
$containerConfigurator->services()
Expand All @@ -26,5 +29,27 @@
])

->set('sonata.user.form.type.reset_password_request', ResetPasswordRequestFormType::class)
->tag('form.type', ['alias' => 'sonata_user_reset_password_request']);
->tag('form.type', ['alias' => 'sonata_user_reset_password_request'])

->set('sonata.user.matrix_roles_builder', MatrixRolesBuilder::class)
->args([
service('security.token_storage'),
service('sonata.user.admin_roles_builder')->nullOnInvalid(),
service('sonata.user.security_roles_builder')->nullOnInvalid(),
])

->set('sonata.user.security_roles_builder', SecurityRolesBuilder::class)
->args([
service('security.authorization_checker'),
service('sonata.admin.configuration')->nullOnInvalid(),
service('translator'),
param('security.role_hierarchy.roles'),
])

->set('sonata.user.form.roles_matrix_type', RolesMatrixType::class)
->public()
->tag('form.type')
->args([
service('sonata.user.matrix_roles_builder'),
]);
};
7 changes: 7 additions & 0 deletions src/Resources/config/twig.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Sonata\UserBundle\Twig\GlobalVariables;
use Sonata\UserBundle\Twig\RolesMatrixExtension;

return static function (ContainerConfigurator $containerConfigurator): void {
$containerConfigurator->services()
Expand All @@ -25,5 +26,11 @@
abstract_arg('impersonating enabled'),
abstract_arg('impersonating route'),
abstract_arg('impersonating route parameters'),
])

->set('sonata.user.roles_matrix_extension', RolesMatrixExtension::class)
->tag('twig.extension')
->args([
service('sonata.user.matrix_roles_builder'),
]);
};
14 changes: 7 additions & 7 deletions src/Security/RolesBuilder/MatrixRolesBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ final class MatrixRolesBuilder implements MatrixRolesBuilderInterface
{
public function __construct(
private TokenStorageInterface $tokenStorage,
private AdminRolesBuilderInterface $adminRolesBuilder,
private ExpandableRolesBuilderInterface $securityRolesBuilder,
private ?AdminRolesBuilderInterface $adminRolesBuilder,
private ?ExpandableRolesBuilderInterface $securityRolesBuilder,
) {
}

Expand All @@ -34,8 +34,8 @@ public function getRoles(?string $domain = null): array
}

return array_merge(
$this->securityRolesBuilder->getRoles($domain),
$this->adminRolesBuilder->getRoles($domain)
$this->securityRolesBuilder?->getRoles($domain) ?? [],
$this->adminRolesBuilder?->getRoles($domain) ?? []
);
}

Expand All @@ -46,13 +46,13 @@ public function getExpandedRoles(?string $domain = null): array
}

return array_merge(
$this->securityRolesBuilder->getExpandedRoles($domain),
$this->adminRolesBuilder->getRoles($domain)
$this->securityRolesBuilder?->getExpandedRoles($domain) ?? [],
$this->adminRolesBuilder?->getRoles($domain) ?? []
);
}

public function getPermissionLabels(): array
{
return $this->adminRolesBuilder->getPermissionLabels();
return $this->adminRolesBuilder?->getPermissionLabels() ?? [];
}
}
5 changes: 4 additions & 1 deletion src/Security/RolesBuilder/SecurityRolesBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ final class SecurityRolesBuilder implements ExpandableRolesBuilderInterface
*/
public function __construct(
private AuthorizationCheckerInterface $authorizationChecker,
private SonataConfiguration $configuration,
private ?SonataConfiguration $configuration,
private TranslatorInterface $translator,
private array $rolesHierarchy = [],
) {
Expand Down Expand Up @@ -84,6 +84,9 @@ public function getRoles(?string $domain = null): array
*/
private function getHierarchy(): array
{
if (null === $this->configuration) {
return $this->rolesHierarchy;
}
$roleSuperAdmin = $this->configuration->getOption('role_super_admin');
\assert(\is_string($roleSuperAdmin));

Expand Down
11 changes: 11 additions & 0 deletions tests/DependencyInjection/SonataUserExtensionNoAdminTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,17 @@ public function testGetGlobalVariablesService(): void
);
}

public function testGetMatrixService(): void
{
$this->load();

$this->assertContainerBuilderHasServiceDefinitionWithArgument(
'sonata.user.matrix_roles_builder',
1,
new Reference('sonata.user.admin_roles_builder', ContainerInterface::NULL_ON_INVALID_REFERENCE)
);
}

/**
* @return mixed[]
*/
Expand Down
66 changes: 66 additions & 0 deletions tests/Security/RolesBuilder/SecurityRolesBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -210,4 +210,70 @@ public function testGetRolesWithExistingRole(): void

static::assertSame($expected, $securityRolesBuilder->getExpandedRoles());
}

public function testGetRolesNoConfiguration(): void
{
$securityRolesBuilder = new SecurityRolesBuilder(
$this->authorizationChecker,
null,
$this->translator,
$this->rolesHierarchy
);

$this->authorizationChecker->method('isGranted')
->willReturn(true);

$expected = [
'ROLE_FOO' => [
'role' => 'ROLE_FOO',
'role_translated' => 'ROLE_FOO: ROLE_BAR, ROLE_ADMIN',
'is_granted' => true,
],
'ROLE_BAR' => [
'role' => 'ROLE_BAR',
'role_translated' => 'ROLE_BAR',
'is_granted' => true,
],
'ROLE_ADMIN' => [
'role' => 'ROLE_ADMIN',
'role_translated' => 'ROLE_ADMIN',
'is_granted' => true,
],
];

static::assertSame($expected, $securityRolesBuilder->getExpandedRoles());
}

public function testGetRolesNotExpandedNoConfiguration(): void
{
$securityRolesBuilder = new SecurityRolesBuilder(
$this->authorizationChecker,
null,
$this->translator,
$this->rolesHierarchy
);

$this->authorizationChecker->method('isGranted')
->willReturn(true);

$expected = [
'ROLE_FOO' => [
'role' => 'ROLE_FOO',
'role_translated' => 'ROLE_FOO',
'is_granted' => true,
],
'ROLE_BAR' => [
'role' => 'ROLE_BAR',
'role_translated' => 'ROLE_BAR',
'is_granted' => true,
],
'ROLE_ADMIN' => [
'role' => 'ROLE_ADMIN',
'role_translated' => 'ROLE_ADMIN',
'is_granted' => true,
],
];

static::assertSame($expected, $securityRolesBuilder->getRoles(null));
}
}
Loading