reverted: --- b/core/modules/system/src/EventSubscriber/GroupRouteSubscriber.php +++ /dev/null @@ -1,145 +0,0 @@ -accessManager = $access_manager; - $this->menuLinkTree = $menu_link_tree; - $this->entityTypeManager = $entity_type_manager; - } - - /** - * {@inheritdoc} - */ - protected function alterRoutes(RouteCollection $collection) { - // Load all roles and leave only non-admin ones with necessary permission. - try { - $roles = $this->entityTypeManager->getStorage('user_role')->loadMultiple(); - $user_storage = $this->entityTypeManager->getStorage('user'); - } - catch (\Exception $e) { - return; - } - $access_roles = []; - $admin_role = ''; - foreach ($roles as $role_id => $role) { - if ($role->isAdmin()) { - $admin_role = $role_id; - continue; - } - if ($role->hasPermission('access administration pages')) { - $access_roles[$role_id] = $user_storage->create([ - 'roles' => [ - $role_id, - ], - ]); - } - } - if (empty($admin_role) || empty($access_roles)) { - return; - } - foreach ($collection->all() as $route_id => $route) { - if ($route->hasOption('_group_route')) { - // Add admin role in order to restrict access for other roles. - $route_accessible_roles = [$admin_role]; - // Perform check. - $this->checkAccess($route_accessible_roles, $collection, $route_id, NULL, NULL, $access_roles); - $route->setRequirement('_role', (string) implode('+', $route_accessible_roles)); - } - } - } - - /** - * Checks route and its children. - * - * @param array $route_accessible_roles - * Array with role names, which are allowed to access route. - * @param Symfony\Component\Routing\RouteCollection $collection - * Routes collection. - * @param string $route_id - * Route ID. - * @param Drupal\user\Entity\User $test_user - * User object for test. - * @param string $test_role - * User's role to be added in array. - * @param array $access_roles - * Array with test users for access checking. - */ - protected function checkAccess(array &$route_accessible_roles, RouteCollection $collection, $route_id, User $test_user = NULL, $test_role = NULL, array $access_roles = NULL) { - // Load all menu links below route - // and check if route has any accessible children by any of roles. - $parameters = new MenuTreeParameters(); - $parameters->setRoot($route_id)->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks(); - $tree = $this->menuLinkTree->load(NULL, $parameters); - if (empty($tree)) { - if ($collection->get($route_id)->hasOption('_group_route')) { - return; - } - $route_accessible_roles[] = $test_role; - } - else { - foreach ($tree as $element_id => $element) { - $url = $element->link->getUrlObject(); - if (!empty($access_roles)) { - foreach ($access_roles as $route_role => $role_user) { - if ($this->accessManager->checkNamedRoute($url->getRouteName(), $url->getRouteParameters(), $role_user) && !in_array($route_role, $route_accessible_roles)) { - // User is allowed to visit this page, but need to check, - // if it's also group route with inaccessible children. - $this->checkAccess($route_accessible_roles, $collection, $element_id, $role_user, $route_role); - } - } - } - else { - if ($this->accessManager->checkNamedRoute($url->getRouteName(), $url->getRouteParameters(), $test_user) && !in_array($test_role, $route_accessible_roles)) { - $route_accessible_roles[] = $test_role; - } - } - } - } - } - -} diff -u b/core/modules/system/tests/src/Functional/Menu/MenuAccessTest.php b/core/modules/system/tests/src/Functional/Menu/MenuAccessTest.php --- b/core/modules/system/tests/src/Functional/Menu/MenuAccessTest.php +++ b/core/modules/system/tests/src/Functional/Menu/MenuAccessTest.php @@ -88,7 +88,8 @@ 'label' => 'Test role', 'id' => 'test_role', ]; - $this->drupalPostform('admin/people/roles/add', $edit, t('Save')); + $this->drupalGet('admin/people/roles/add'); + $this->submitForm($edit, 'Save'); $this->assertSession()->statusCodeEquals(200); // Give access to toolbar, theme and admin pages. @@ -97,7 +98,8 @@ 'test_role[view the administration theme]' => TRUE, 'test_role[access toolbar]' => TRUE, ]; - $this->drupalPostform('admin/people/permissions/test_role', $edit, t('Save permissions')); + $this->drupalGet('admin/people/permissions/test_role'); + $this->submitForm($edit, 'Save permissions'); $this->assertSession()->statusCodeEquals(200); // Create a user with the role created above and login with this user. @@ -105,7 +107,8 @@ $edit = [ 'roles[test_role]' => 'test_role', ]; - $this->drupalPostform('user/' . $webUser->id() . '/edit', $edit, t('Save')); + $this->drupalGet('user/' . $webUser->id() . '/edit'); + $this->submitForm($edit, 'Save'); $this->assertSession()->statusCodeEquals(200); $this->drupalLogout(); $this->drupalLogin($webUser);