diff --git a/core/modules/user/src/PermissionHandler.php b/core/modules/user/src/PermissionHandler.php index 056c435dff..6607c0e56c 100644 --- a/core/modules/user/src/PermissionHandler.php +++ b/core/modules/user/src/PermissionHandler.php @@ -70,6 +70,13 @@ class PermissionHandler implements PermissionHandlerInterface { */ protected $controllerResolver; + /** + * List of permissions. + * + * @var array + */ + protected $allPermissions = []; + /** * Constructs a new PermissionHandler. * @@ -105,17 +112,18 @@ protected function getYamlDiscovery() { * {@inheritdoc} */ public function getPermissions() { - $all_permissions = $this->buildPermissionsYaml(); - - return $this->sortPermissions($all_permissions); + if (empty($this->allPermissions)) { + $this->allPermissions = $this->sortPermissions($this->buildPermissionsYaml()); + // Invoke hook_permissions_alter(). + $this->moduleHandler->alter('permissions', $this->allPermissions); + } + return $this->allPermissions; } /** * {@inheritdoc} */ public function moduleProvidesPermissions($module_name) { - // @TODO Static cache this information, see - // https://www.drupal.org/node/2339487 $permissions = $this->getPermissions(); foreach ($permissions as $permission) { diff --git a/core/modules/user/tests/src/Traits/UserCreationTrait.php b/core/modules/user/tests/src/Traits/UserCreationTrait.php index 9d687fd4e5..4024e4484e 100644 --- a/core/modules/user/tests/src/Traits/UserCreationTrait.php +++ b/core/modules/user/tests/src/Traits/UserCreationTrait.php @@ -307,6 +307,9 @@ protected function createRole(array $permissions, $rid = NULL, $name = NULL, $we * TRUE if the permissions are valid, FALSE otherwise. */ protected function checkPermissions(array $permissions) { + // Reset the user.permissions service to reset statically cached + // permissions. + \Drupal::getContainer()->set('user.permissions', NULL); $available = array_keys(\Drupal::service('user.permissions')->getPermissions()); $valid = TRUE; foreach ($permissions as $permission) { diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 74ce5de07c..26eaee25e0 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -1350,12 +1350,24 @@ function user_form_process_password_confirm($element) { return $element; } +/** + * Implements hook_modules_installed(). + */ +function user_modules_installed($modules) { + // Reset the user.permissions service to reset statically cached + // permissions. + \Drupal::getContainer()->set('user.permissions', NULL); +} + /** * Implements hook_modules_uninstalled(). */ function user_modules_uninstalled($modules) { // Remove any potentially orphan module data stored for users. \Drupal::service('user.data')->delete($modules); + // Reset the user.permissions service to reset statically cached + // permissions. + \Drupal::getContainer()->set('user.permissions', NULL); } /**