diff --git a/core/lib/Drupal/Core/Session/UserSession.php b/core/lib/Drupal/Core/Session/UserSession.php
index af33674..1f15900 100644
--- a/core/lib/Drupal/Core/Session/UserSession.php
+++ b/core/lib/Drupal/Core/Session/UserSession.php
@@ -94,6 +94,13 @@ class UserSession implements AccountInterface {
   protected $timezone;
 
   /**
+   * The role objects the user has.
+   *
+   * @var \Drupal\user\Entity\Role[]
+   */
+  protected $loadedRoles;
+
+  /**
    * Constructs a new user session.
    *
    * @param array $values
@@ -128,9 +135,7 @@ public function hasPermission($permission) {
       return TRUE;
     }
 
-    $roles = \Drupal::entityManager()->getStorageController('user_role')->loadMultiple($this->getRoles());
-
-    foreach ($roles as $role) {
+    foreach ($this->getRolesAsEntities() as $role) {
       if ($role->hasPermission($permission)) {
         return TRUE;
       }
@@ -140,6 +145,19 @@ public function hasPermission($permission) {
   }
 
   /**
+   * Gets and loads the roles.
+   *
+   * @return \Drupal\user\Entity\Role[]
+   *   The loaded roles.
+   */
+  protected function getRolesAsEntities() {
+    if (!isset($this->loadedRoles)) {
+      $this->loadedRoles = \Drupal::entityManager()->getStorageController('user_role')->loadMultiple($this->getRoles());
+    }
+    return $this->loadedRoles;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getSecureSessionId() {
diff --git a/core/modules/user/lib/Drupal/user/Entity/User.php b/core/modules/user/lib/Drupal/user/Entity/User.php
index 44bce77..ab94f33 100644
--- a/core/modules/user/lib/Drupal/user/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Entity/User.php
@@ -52,6 +52,13 @@
 class User extends ContentEntityBase implements UserInterface {
 
   /**
+   * The role objects the user has.
+   *
+   * @var \Drupal\user\Entity\Role[]
+   */
+  protected $loadedRoles;
+
+  /**
    * {@inheritdoc}
    */
   public function id() {
@@ -226,9 +233,7 @@ public function hasPermission($permission) {
       return TRUE;
     }
 
-    $roles = \Drupal::entityManager()->getStorageController('user_role')->loadMultiple($this->getRoles());
-
-    foreach ($roles as $role) {
+    foreach ($this->getRolesAsEntities() as $role) {
       if ($role->hasPermission($permission)) {
         return TRUE;
       }
@@ -238,6 +243,19 @@ public function hasPermission($permission) {
   }
 
   /**
+   * Gets and loads the roles.
+   *
+   * @return \Drupal\user\Entity\Role[]
+   *   The loaded roles.
+   */
+  protected function getRolesAsEntities() {
+    if (!isset($this->loadedRoles)) {
+      $this->loadedRoles = \Drupal::entityManager()->getStorageController('user_role')->loadMultiple($this->getRoles());
+    }
+    return $this->loadedRoles;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getPassword() {
