diff --git a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
index fcb8627ba7..b090e807c0 100644
--- a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
+++ b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
@@ -56,6 +56,7 @@ public function viewsForm(array &$form, FormStateInterface $form_state) {
     foreach ($this->view->result as $row_index => $row) {
       $entity = $this->getEntity($row);
       $form[$this->options['id']][$row_index] = [
+        '#access' => $entity->access('view'),
         '#type' => 'checkbox',
         '#title' => $this->t('Select @label', [
           '@label' => $entity->label(),
diff --git a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module
index 3d9576bc1a..e794459936 100644
--- a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module
+++ b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -16,3 +17,10 @@
 function media_library_test_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) {
   return AccessResult::forbiddenIf($field_definition->getName() === 'field_media_no_access', 'Field access denied by test module');
 }
+
+/**
+ * Implements hook_entity_access().
+ */
+function media_library_test_media_access(EntityInterface $entity, $operation, AccountInterface $account) {
+  return AccessResult::forbiddenIf($entity->bundle() === 'type_one' && $entity->label() === 'Mosquito', 'Entity access denied by test module');
+}
diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
index d4601eef0f..4659601b54 100644
--- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
+++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
@@ -50,6 +50,9 @@ protected function setUp() {
         'Bear',
         'Cat',
         'Dog',
+        // Access to the 'Mosquito' media item is prevented by
+        // media_library_test_entity_access().
+        'Mosquito',
       ],
       'type_two' => [
         'Crocodile',
@@ -107,6 +110,9 @@ public function testAdministrationPage() {
     $assert_session->pageTextContains('Dog');
     $assert_session->pageTextContains('Turtle');
 
+    // Verify the forbidden media item is not present.
+    $assert_session->pageTextNotContains('Mosquito');
+
     // Verify that the media name does not contain a link.
     $assert_session->elementNotExists('css', '.media-library-item__name a');
     // Verify that there are links to edit and delete media items.
@@ -149,6 +155,8 @@ public function testAdministrationPage() {
     $assert_session->pageTextNotContains('Snake');
 
     // Test empty text.
+    \Drupal::entityTypeManager()->getStorage('media')->delete(Media::loadMultiple());
+    $this->drupalGet('admin/content/media');
     $assert_session->pageTextContains('No media available.');
 
     // Verify that the "Table" link is present, click it and check address.
@@ -298,7 +306,7 @@ public function testViewsAdmin() {
     // Assert that the widget can be seen and that there are 8 items.
     $this->drupalGet('/admin/structure/views/view/media_library/edit/widget');
     $assert_session->assertWaitOnAjaxRequest();
-    $assert_session->elementsCount('css', '.media-library-item', 8);
+    $assert_session->elementsCount('css', '.media-library-item', 9);
 
     // Assert that filtering works in live preview.
     $page->find('css', '.media-library-view .view-filters')->fillField('name', 'snake');
@@ -309,7 +317,7 @@ public function testViewsAdmin() {
     // Test the same routine but in the view for the table wiget.
     $this->drupalGet('/admin/structure/views/view/media_library/edit/widget_table');
     $assert_session->assertWaitOnAjaxRequest();
-    $assert_session->elementsCount('css', '.media-library-item', 8);
+    $assert_session->elementsCount('css', '.media-library-item', 9);
 
     // Assert that filtering works in live preview.
     $page->find('css', '.media-library-view .view-filters')->fillField('name', 'snake');
@@ -537,6 +545,9 @@ public function testWidget() {
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Dog');
     $assert_session->pageTextContains('Bear');
+    // Verify the forbidden media item is not present.
+    $assert_session->pageTextNotContains('Mosquito');
+    // Verify a media item of a different type is not present.
     $assert_session->pageTextNotContains('Turtle');
     $page->clickLink('Type Three');
     $assert_session->assertWaitOnAjaxRequest();
@@ -727,7 +738,7 @@ public function testWidget() {
     $checkboxes[0]->click();
     // Assert the selection is updated correctly.
     $assert_session->elementTextContains('css', '.media-library-selected-count', '2 of 2 items selected');
-    $assert_session->hiddenFieldValueEquals('media-library-modal-selection', '3,8');
+    $assert_session->hiddenFieldValueEquals('media-library-modal-selection', '3,9');
     // Assert unselected items are disabled when the maximum allowed items are
     // selected (cardinality for this field is 2).
     $this->assertFalse($checkboxes[0]->hasAttribute('disabled'));
diff --git a/core/modules/views/src/Plugin/views/field/BulkForm.php b/core/modules/views/src/Plugin/views/field/BulkForm.php
index 5ee5891d9d..737faa252a 100644
--- a/core/modules/views/src/Plugin/views/field/BulkForm.php
+++ b/core/modules/views/src/Plugin/views/field/BulkForm.php
@@ -311,6 +311,7 @@ public function viewsForm(&$form, FormStateInterface $form_state) {
         $entity = $this->getEntityTranslation($this->getEntity($row), $row);
 
         $form[$this->options['id']][$row_index] = [
+          '#access' => $entity->access('view'),
           '#type' => 'checkbox',
           // We are not able to determine a main "title" for each row, so we can
           // only output a generic label.
