diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index fe6e06d..51da823 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -238,6 +238,10 @@ function book_node_load($nodes) {
 function book_node_view(array &$build, EntityInterface $node, EntityViewDisplayInterface $display, $view_mode) {
   if ($view_mode == 'full') {
     if (!empty($node->book['bid']) && empty($node->in_preview)) {
+      $book_node = Node::load($node->book['bid']);
+      if (!$book_node->access()) {
+        return;
+      }
       $book_navigation = array( '#theme' => 'book_navigation', '#book_link' => $node->book);
       $build['book_navigation'] = array(
         '#markup' => drupal_render($book_navigation),
diff --git a/core/modules/book/src/BookManager.php b/core/modules/book/src/BookManager.php
index 3f5cfdc..376cc69 100644
--- a/core/modules/book/src/BookManager.php
+++ b/core/modules/book/src/BookManager.php
@@ -695,7 +695,7 @@ public function loadBookLink($nid, $translate = TRUE) {
    * {@inheritdoc}
    */
   public function loadBookLinks($nids, $translate = TRUE) {
-    $result = $this->bookOutlineStorage->loadMultiple($nids);
+    $result = $this->bookOutlineStorage->loadMultiple($nids, $translate);
     $links = array();
     foreach ($result as $link) {
       if ($translate) {
diff --git a/core/modules/book/src/BookOutlineStorage.php b/core/modules/book/src/BookOutlineStorage.php
index 8e8271d..9af8a60 100644
--- a/core/modules/book/src/BookOutlineStorage.php
+++ b/core/modules/book/src/BookOutlineStorage.php
@@ -47,12 +47,16 @@ public function hasBooks() {
   /**
    * {@inheritdoc}
    */
-  public function loadMultiple($nids) {
+  public function loadMultiple($nids, $access = TRUE) {
     $query = $this->connection->select('book', 'b', array('fetch' => \PDO::FETCH_ASSOC));
     $query->fields('b');
     $query->condition('b.nid', $nids);
-    $query->addTag('node_access');
-    $query->addMetaData('base_table', 'book');
+
+    if ($access) {
+      $query->addTag('node_access');
+      $query->addMetaData('base_table', 'book');
+    }
+
     return $query->execute();
   }
 
diff --git a/core/modules/book/src/BookOutlineStorageInterface.php b/core/modules/book/src/BookOutlineStorageInterface.php
index e08fab6..c03f3aa 100644
--- a/core/modules/book/src/BookOutlineStorageInterface.php
+++ b/core/modules/book/src/BookOutlineStorageInterface.php
@@ -33,11 +33,13 @@ public function hasBooks();
    *
    * @param array $nids
    *   An array of node IDs.
+   * @param bool $access
+   *   Whether access checking should be taken into account
    *
-   * @return array
-   *   Array of loaded book items.
+   * @return array Array of loaded book items.
+   * Array of loaded book items.
    */
-  public function loadMultiple($nids);
+  public function loadMultiple($nids, $access = TRUE);
 
   /**
    * Gets child relative depth.
diff --git a/core/modules/book/src/Tests/BookTest.php b/core/modules/book/src/Tests/BookTest.php
index 0064a66..0f88dc8 100644
--- a/core/modules/book/src/Tests/BookTest.php
+++ b/core/modules/book/src/Tests/BookTest.php
@@ -52,6 +52,13 @@ class BookTest extends WebTestBase {
    */
   protected $adminUser;
 
+  /**
+   * A user without the 'node test view' permission.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $webUserWithoutNodeAccess;
+
   protected function setUp() {
     parent::setUp();
 
@@ -61,6 +68,7 @@ protected function setUp() {
     // Create users.
     $this->bookAuthor = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books'));
     $this->webUser = $this->drupalCreateUser(array('access printer-friendly version', 'node test view'));
+    $this->webUserWithoutNodeAccess = $this->drupalCreateUser(array('access printer-friendly version'));
     $this->adminUser = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books', 'administer blocks', 'administer permissions', 'administer book outlines', 'node test view', 'administer content types', 'administer site configuration'));
   }
 
@@ -660,4 +668,35 @@ public function testAdminBookListing() {
     $this->assertText($this->book->label(), 'The book title is displayed on the administrative book listing page.');
   }
 
+  /**
+   * Ensure the loaded book in hook_node_load() does not depend on the user.
+   */
+  public function testHookNodeLoadAccess() {
+    \Drupal::service('module_installer')->install(['node_access_test']);
+
+    // Ensure that the loaded book in hook_node_load() does NOT depend on the
+    // current user.
+    $this->drupalLogin($this->bookAuthor);
+    $this->book = $this->createBookNode('new');
+    // Reset any internal static caching.
+    $node_storage = \Drupal::entityManager()->getStorage('node');
+    $node_storage->resetCache();
+
+    // Login as user without access to the book node, so no 'node test view'
+    // permission.
+    // @see node_access_test_node_grants().
+    $this->drupalLogin($this->webUserWithoutNodeAccess);
+    $book_node = $node_storage->load($this->book->id());
+    $this->assertTrue(!empty($book_node->book));
+    $this->assertEqual($book_node->book['bid'], $this->book->id());
+
+    // Reset the internal cache to retrigger the hook_node_load() call.
+    $node_storage->resetCache();
+
+    $this->drupalLogin($this->webUser);
+    $book_node = $node_storage->load($this->book->id());
+    $this->assertTrue(!empty($book_node->book));
+    $this->assertEqual($book_node->book['bid'], $this->book->id());
+  }
+
 }
