From 508b62fd788f009b77ae0c3aa1ddc21d54a648ba Mon Sep 17 00:00:00 2001 From: Simon Jamain Date: Mon, 7 Jul 2025 14:21:30 +0200 Subject: [PATCH] [Security] Improve performance of `RoleHierarchy::buildRoleMap` method --- .../Component/Security/Core/Role/RoleHierarchy.php | 2 +- .../Security/Core/Tests/Role/RoleHierarchyTest.php | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/Security/Core/Role/RoleHierarchy.php b/src/Symfony/Component/Security/Core/Role/RoleHierarchy.php index a2a584579037c..e625c0d6eb681 100644 --- a/src/Symfony/Component/Security/Core/Role/RoleHierarchy.php +++ b/src/Symfony/Component/Security/Core/Role/RoleHierarchy.php @@ -54,7 +54,7 @@ protected function buildRoleMap(): void $this->map[$main] = $roles; $visited = []; $additionalRoles = $roles; - while ($role = array_shift($additionalRoles)) { + while ($role = array_pop($additionalRoles)) { if (!isset($this->hierarchy[$role])) { continue; } diff --git a/src/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php b/src/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php index 5c42e0b39f8bf..945ed17494414 100644 --- a/src/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php @@ -23,11 +23,11 @@ public function testGetReachableRoleNames() 'ROLE_SUPER_ADMIN' => ['ROLE_ADMIN', 'ROLE_FOO'], ]); - $this->assertEquals(['ROLE_USER'], $role->getReachableRoleNames(['ROLE_USER'])); - $this->assertEquals(['ROLE_FOO'], $role->getReachableRoleNames(['ROLE_FOO'])); - $this->assertEquals(['ROLE_ADMIN', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_ADMIN'])); - $this->assertEquals(['ROLE_FOO', 'ROLE_ADMIN', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_FOO', 'ROLE_ADMIN'])); - $this->assertEquals(['ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_FOO', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_SUPER_ADMIN'])); - $this->assertEquals(['ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_FOO', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_SUPER_ADMIN', 'ROLE_SUPER_ADMIN'])); + $this->assertEqualsCanonicalizing(['ROLE_USER'], $role->getReachableRoleNames(['ROLE_USER'])); + $this->assertEqualsCanonicalizing(['ROLE_FOO'], $role->getReachableRoleNames(['ROLE_FOO'])); + $this->assertEqualsCanonicalizing(['ROLE_ADMIN', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_ADMIN'])); + $this->assertEqualsCanonicalizing(['ROLE_FOO', 'ROLE_ADMIN', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_FOO', 'ROLE_ADMIN'])); + $this->assertEqualsCanonicalizing(['ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_FOO', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_SUPER_ADMIN'])); + $this->assertEqualsCanonicalizing(['ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_FOO', 'ROLE_USER'], $role->getReachableRoleNames(['ROLE_SUPER_ADMIN', 'ROLE_SUPER_ADMIN'])); } }