diff -u b/core/lib/Drupal/Core/Session/UserSession.php b/core/lib/Drupal/Core/Session/UserSession.php --- b/core/lib/Drupal/Core/Session/UserSession.php +++ b/core/lib/Drupal/Core/Session/UserSession.php @@ -243,14 +243,13 @@ } /** + * Returns the role storage object. + * * @return \Drupal\user\RoleStorageInterface * The role storage object. */ protected function getRoleStorage() { - if (!isset($this->roleStorage)) { - $this->roleStorage = \Drupal::entityManager()->getStorage('user_role'); - } - return $this->roleStorage; + return \Drupal::entityManager()->getStorage('user_role'); } } diff -u b/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php --- b/core/modules/user/src/Entity/User.php +++ b/core/modules/user/src/Entity/User.php @@ -531,11 +531,11 @@ /** + * Returns the role storage object. + * * @return \Drupal\user\RoleStorageInterface * The role storage object. */ protected function getRoleStorage() { - if (!isset($this->roleStorage)) { - $this->roleStorage = \Drupal::entityManager()->getStorage('user_role'); - } - return $this->roleStorage; + return \Drupal::entityManager()->getStorage('user_role'); } + } diff -u b/core/modules/user/src/RoleStorage.php b/core/modules/user/src/RoleStorage.php --- b/core/modules/user/src/RoleStorage.php +++ b/core/modules/user/src/RoleStorage.php @@ -14,7 +14,10 @@ */ class RoleStorage extends ConfigEntityStorage implements RoleStorageInterface { - public function isPermissionInRoles($permission, $role_names) { + /** + * {@inheritdoc} + */ + public function isPermissionInRoles($permission, array $rids) { $has_permission = FALSE; foreach ($this->loadMultiple($role_names) as $role) { if ($role->hasPermission($permission)) { only in patch2: unchanged: --- a/core/modules/user/src/RoleStorageInterface.php +++ b/core/modules/user/src/RoleStorageInterface.php @@ -15,6 +15,19 @@ interface RoleStorageInterface extends ConfigEntityStorageInterface { /** + * Returns whether a permission is in one of the passed in roles. + * + * @param string $permission + * The permission. + * @param array $rids + * The list of role IDs to check. + * + * @return bool + * TRUE is the permission is in at least one of the roles. FALSE otherwise. + */ + public function isPermissionInRoles($permission, array $rids); + + /** * Delete role references. * * @param array $rids only in patch2: unchanged: --- a/core/tests/Drupal/Tests/Core/Session/UserSessionTest.php +++ b/core/tests/Drupal/Tests/Core/Session/UserSessionTest.php @@ -93,17 +93,20 @@ protected function setUp() { $role_storage = $this->getMockBuilder('Drupal\user\RoleStorage') ->disableOriginalConstructor() - ->setMethods(array('loadMultiple')) + ->setMethods(array('isPermissionInRoles')) ->getMock(); $role_storage->expects($this->any()) - ->method('loadMultiple') - ->will($this->returnValueMap(array( - array(array(), array()), - array(NULL, $roles), - array(array('role_one'), array($roles['role_one'])), - array(array('role_two'), array($roles['role_two'])), - array(array('role_one', 'role_two'), array($roles['role_one'], $roles['role_two'])), - ))); + ->method('isPermissionInRoles') + ->will($this->returnCallback(function ($permission, $rids) use ($roles) { + $result = FALSE; + foreach ($rids as $rid) { + if ($roles[$rid]->hasPermission($permission)) { + $result = TRUE; + break; + } + } + return $result; + })); $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface'); $entity_manager->expects($this->any())