diff --git a/src/Entity/EntityBrowser.php b/src/Entity/EntityBrowser.php
index 6011f63..c969c5e 100644
--- a/src/Entity/EntityBrowser.php
+++ b/src/Entity/EntityBrowser.php
@@ -303,6 +303,9 @@ class EntityBrowser extends ConfigEntityBase implements EntityBrowserInterface,
    */
   public function getFirstWidget() {
     $instance_ids = $this->getWidgets()->getInstanceIds();
+    $instance_ids = array_filter($instance_ids, function ($id) {
+      return $this->getWidget($id)->access()->isAllowed();
+    });
     return reset($instance_ids);
   }
 
diff --git a/src/EntityBrowserFormInterface.php b/src/EntityBrowserFormInterface.php
index 335fe96..d274b6e 100644
--- a/src/EntityBrowserFormInterface.php
+++ b/src/EntityBrowserFormInterface.php
@@ -17,4 +17,12 @@ interface EntityBrowserFormInterface extends FormInterface {
    */
   public function setEntityBrowser(EntityBrowserInterface $entity_browser);
 
+  /**
+   * Gets entity browser entity,
+   *
+   * @return \Drupal\entity_browser\EntityBrowserInterface
+   *   Entity browser entity.
+   */
+  public function getEntityBrowser();
+
 }
diff --git a/src/Form/EntityBrowserForm.php b/src/Form/EntityBrowserForm.php
index 340e425..8383862 100644
--- a/src/Form/EntityBrowserForm.php
+++ b/src/Form/EntityBrowserForm.php
@@ -11,6 +11,7 @@ use Drupal\entity_browser\DisplayAjaxInterface;
 use Drupal\entity_browser\EntityBrowserFormInterface;
 use Drupal\entity_browser\EntityBrowserInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Render\RendererInterface;
 
 /**
  * The entity browser form.
@@ -39,16 +40,26 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
   protected $selectionStorage;
 
   /**
+   * The renderer service.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
    * Constructs a EntityBrowserForm object.
    *
    * @param \Drupal\Component\Uuid\UuidInterface $uuid_generator
    *   The UUID generator service.
    * @param \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface $selection_storage
    *   Selection storage.
+   * @param \Drupal\Core\Render\RendererInterface $renderer
+   *   The renderer service.
    */
-  public function __construct(UuidInterface $uuid_generator, KeyValueStoreExpirableInterface $selection_storage) {
+  public function __construct(UuidInterface $uuid_generator, KeyValueStoreExpirableInterface $selection_storage, RendererInterface $renderer) {
     $this->uuidGenerator = $uuid_generator;
     $this->selectionStorage = $selection_storage;
+    $this->renderer = $renderer;
   }
 
   /**
@@ -57,7 +68,8 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('uuid'),
-      $container->get('entity_browser.selection_storage')
+      $container->get('entity_browser.selection_storage'),
+      $container->get('renderer')
     );
   }
 
@@ -76,6 +88,13 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getEntityBrowser() {
+    return $this->entityBrowser;
+  }
+
+  /**
    * Initializes form state.
    *
    * @param \Drupal\Core\Form\FormStateInterface $form_state
@@ -130,10 +149,21 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
     $form[$form['#browser_parts']['widget_selector']] = $this->entityBrowser
       ->getWidgetSelector()
       ->getForm($form, $form_state);
-    $form[$form['#browser_parts']['widget']] = $this->entityBrowser
-      ->getWidgets()
-      ->get($this->getCurrentWidget($form_state))
-      ->getForm($form, $form_state, $this->entityBrowser->getAdditionalWidgetParameters());
+
+    $widget = $this->entityBrowser->getWidget($this->getCurrentWidget($form_state));
+    if ($widget->access()->isAllowed()) {
+      $form[$form['#browser_parts']['widget']] = $widget->getForm($form, $form_state, $this->entityBrowser->getAdditionalWidgetParameters());
+    }
+    else {
+      $form[$form['#browser_parts']['widget']]['#markup'] = $this->t('Access to the widget forbidden.');
+    }
+
+    // Add cache access cache metadata from the widgets to the form directly as
+    // it is affected.
+    foreach ($this->entityBrowser->getWidgets() as $widget) {
+      /** @var \Drupal\entity_browser\WidgetInterface $widget */
+      $this->renderer->addCacheableDependency($form, $widget->access());
+    }
 
     $form[$form['#browser_parts']['selection_display']] = $this->entityBrowser
       ->getSelectionDisplay()
diff --git a/src/Plugin/EntityBrowser/Widget/View.php b/src/Plugin/EntityBrowser/Widget/View.php
index 605f782..9335dca 100644
--- a/src/Plugin/EntityBrowser/Widget/View.php
+++ b/src/Plugin/EntityBrowser/Widget/View.php
@@ -3,6 +3,7 @@
 namespace Drupal\entity_browser\Plugin\EntityBrowser\Widget;
 
 use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
 use Drupal\entity_browser\WidgetBase;
@@ -279,4 +280,20 @@ class View extends WidgetBase implements ContainerFactoryPluginInterface {
     return $dependencies;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function access() {
+    // Mark the widget as not visible if the user has no access to the view.
+    /** @var \Drupal\views\ViewExecutable $view */
+    $view = $this->entityTypeManager
+      ->getStorage('view')
+      ->load($this->configuration['view'])
+      ->getExecutable();
+
+
+    // Check if the current user has access to this view.
+    return AccessResult::allowedIf($view->access($this->configuration['view_display']));
+  }
+
 }
diff --git a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
index 1cb3483..db44a43 100644
--- a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
+++ b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php
@@ -20,13 +20,24 @@ class DropDown extends WidgetSelectorBase {
    * {@inheritdoc}
    */
   public function getForm(array &$form = array(), FormStateInterface &$form_state = NULL) {
+    $element = [];
     // Set a wrapper container for us to replace the form on ajax call.
     $form['#prefix'] = '<div id="entity-browser-form">';
     $form['#suffix'] = '</div>';
 
+    /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */
+    $browser = $form_state->getFormObject()->getEntityBrowser();
+
+    $widget_ids = [];
+    foreach ($this->widget_ids as $widget_id => $widget_name) {
+      if ($browser->getWidget($widget_id)->access()->isAllowed()) {
+        $widget_ids[$widget_id] = $widget_name;
+      }
+    }
+
     $element['widget'] = array(
       '#type' => 'select',
-      '#options' => $this->widget_ids,
+      '#options' => $widget_ids,
       '#default_value' => $this->getDefaultWidget(),
       '#executes_submit_callback' => TRUE,
       '#limit_validation_errors' => array(array('widget')),
diff --git a/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php b/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
index b0c1f60..6678b04 100644
--- a/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
+++ b/src/Plugin/EntityBrowser/WidgetSelector/Tabs.php
@@ -21,6 +21,8 @@ class Tabs extends WidgetSelectorBase {
    */
   public function getForm(array &$form = array(), FormStateInterface &$form_state = NULL) {
     $element = [];
+    /** @var \Drupal\entity_browser\EntityBrowserInterface $browser */
+    $browser = $form_state->getFormObject()->getEntityBrowser();
     foreach ($this->widget_ids as $id => $label) {
       $name = 'tab_selector_' . $id;
       $element[$name] = array(
@@ -34,6 +36,7 @@ class Tabs extends WidgetSelectorBase {
         '#submit' => array(),
         '#name' => $name,
         '#widget_id' => $id,
+        '#access' => $browser->getWidget($id)->access(),
       );
     }
 
diff --git a/src/WidgetBase.php b/src/WidgetBase.php
index da094e4..f5d2ea7 100644
--- a/src/WidgetBase.php
+++ b/src/WidgetBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\entity_browser;
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\Core\Form\FormStateInterface;
@@ -372,4 +373,11 @@ abstract class WidgetBase extends PluginBase implements WidgetInterface, Contain
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function access() {
+    return AccessResult::allowed();
+  }
+
 }
diff --git a/src/WidgetInterface.php b/src/WidgetInterface.php
index 0a1140f..c88f4b8 100644
--- a/src/WidgetInterface.php
+++ b/src/WidgetInterface.php
@@ -118,4 +118,12 @@ interface WidgetInterface extends PluginInspectionInterface, ConfigurablePluginI
    */
   public function requiresJsCommands();
 
+  /**
+   * Defines if the widget is visible / accessible in a given context.
+   *
+   * @return \Drupal\Core\Access\AccessResultInterface
+   *   The access result.
+   */
+  public function access();
+
 }
diff --git a/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml
index 65178f0..d75ba00 100644
--- a/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml
+++ b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml
@@ -35,3 +35,10 @@ widgets:
     weight: -10
     label: view
     id: view
+  cbc59500-04ab-4395-b063-c561f0e3bf80:
+    id: dummy
+    label: dummy
+    weight: -8
+    uuid: cbc59500-04ab-4395-b063-c561f0e3bf80
+    settings:
+      text: 'This is dummy widget.'
diff --git a/tests/modules/entity_browser_test/entity_browser_test.services.yml b/tests/modules/entity_browser_test/entity_browser_test.services.yml
new file mode 100644
index 0000000..17e1f17
--- /dev/null
+++ b/tests/modules/entity_browser_test/entity_browser_test.services.yml
@@ -0,0 +1,5 @@
+services:
+  cache_context.eb_dummy:
+    class: Drupal\entity_browser_test\Cache\Context\DummyCacheContext
+    tags:
+      - { name: cache.context}
diff --git a/tests/modules/entity_browser_test/src/Cache/Context/DummyCacheContext.php b/tests/modules/entity_browser_test/src/Cache/Context/DummyCacheContext.php
new file mode 100644
index 0000000..ee53905
--- /dev/null
+++ b/tests/modules/entity_browser_test/src/Cache/Context/DummyCacheContext.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\entity_browser_test\Cache\Context;
+
+use Drupal\Core\Cache\CacheableMetadata;
+use Drupal\Core\Cache\Context\CacheContextInterface;
+
+/**
+ * Dummy cache context for Entity browser test purposes.
+ *
+ * Cache context ID: 'eb_dummy'.
+ */
+class DummyCacheContext implements CacheContextInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getLabel() {
+    return t('Dummy context');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContext() {
+    return "dummy";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheableMetadata() {
+    return new CacheableMetadata();
+  }
+
+}
diff --git a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
index 7d19edf..820d271 100644
--- a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
+++ b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\entity_browser_test\Plugin\EntityBrowser\Widget;
 
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\entity_browser\WidgetBase;
 
@@ -55,4 +56,19 @@ class DummyWidget extends WidgetBase {
     return $form_state->getValue('dummy_entities', []);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function access() {
+    if (\Drupal::state()->get('eb_test_dummy_widget_access', TRUE)) {
+      $access = AccessResult::allowed();
+      $access->addCacheContexts(['eb_dummy']);
+    }
+    else {
+      $access = AccessResult::forbidden();
+      $access->addCacheContexts(['eb_dummy']);
+    }
+    return $access;
+  }
+
 }
diff --git a/tests/src/FunctionalJavascript/EntityBrowserTest.php b/tests/src/FunctionalJavascript/EntityBrowserTest.php
index e8add2c..857d2c1 100644
--- a/tests/src/FunctionalJavascript/EntityBrowserTest.php
+++ b/tests/src/FunctionalJavascript/EntityBrowserTest.php
@@ -78,6 +78,7 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase {
 
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
 
+    $this->assertSession()->linkExists('dummy');
     $this->assertSession()->linkExists('view');
     $this->assertSession()->linkExists('upload');
 
@@ -102,6 +103,26 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase {
     //  'files[upload][]' => $this->container->get('file_system')->realpath($image2->getFileUri()),
     //];
     // $this->drupalPostForm(NULL, $edit, 'Select files');.
+
+    \Drupal::state()->set('eb_test_dummy_widget_access', FALSE);
+    $this->drupalGet('entity-browser/iframe/test_entity_browser_file');
+    $this->assertSession()->linkNotExists('dummy');
+    $this->assertSession()->linkExists('view');
+    $this->assertSession()->linkExists('upload');
+    $this->assertSession()->responseHeaderContains('X-Drupal-Cache-Contexts', 'eb_dummy');
+
+    // Move dummy widget to the first place and make sure it does not appear.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file');
+    $browser->getWidget('cbc59500-04ab-4395-b063-c561f0e3bf80')->setWeight(-15);
+    $browser->save();
+    $this->drupalGet('entity-browser/iframe/test_entity_browser_file');
+    $this->assertSession()->linkNotExists('dummy');
+    $this->assertSession()->linkExists('view');
+    $this->assertSession()->linkExists('upload');
+    $this->assertSession()->pageTextNotContains('This is dummy widget.');
+    $this->assertSession()->responseHeaderContains('X-Drupal-Cache-Contexts', 'eb_dummy');
   }
 
   /**
@@ -130,6 +151,9 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase {
     $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file');
 
     $this->assertSession()->selectExists('widget');
+    $this->assertSession()->optionExists('widget', 'cbc59500-04ab-4395-b063-c561f0e3bf80'); // Dummy
+    $this->assertSession()->optionExists('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87'); // Upload
+    $this->assertSession()->optionExists('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); // View
     // Selects the view widget.
     $this->getSession()->getPage()->selectFieldOption('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d');
 
@@ -148,10 +172,30 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase {
     // Causes a fatal.
     // Selects the upload widget.
     // $this->getSession()->getPage()->selectFieldOption('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87');.
+
+    \Drupal::state()->set('eb_test_dummy_widget_access', FALSE);
+    $this->drupalGet('entity-browser/iframe/test_entity_browser_file');
+    $this->assertSession()->optionNotExists('widget', 'cbc59500-04ab-4395-b063-c561f0e3bf80'); // Dummy
+    $this->assertSession()->optionExists('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87'); // Upload
+    $this->assertSession()->optionExists('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); // View
+    $this->assertSession()->responseHeaderContains('X-Drupal-Cache-Contexts', 'eb_dummy');
+
+    // Move dummy widget to the first place and make sure it does not appear.
+    $browser = $this->container->get('entity_type.manager')
+      ->getStorage('entity_browser')
+      ->load('test_entity_browser_file');
+    $browser->getWidget('cbc59500-04ab-4395-b063-c561f0e3bf80')->setWeight(-15);
+    $browser->save();
+    $this->drupalGet('entity-browser/iframe/test_entity_browser_file');
+    $this->assertSession()->optionNotExists('widget', 'cbc59500-04ab-4395-b063-c561f0e3bf80'); // Dummy
+    $this->assertSession()->optionExists('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87'); // Upload
+    $this->assertSession()->optionExists('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); // View
+    $this->assertSession()->pageTextNotContains('This is dummy widget.');
+    $this->assertSession()->responseHeaderContains('X-Drupal-Cache-Contexts', 'eb_dummy');
   }
 
   /**
-   * Tests wievs selection display.
+   * Tests views selection display.
    */
   public function testViewsSelectionDisplayWidget() {
 
diff --git a/tests/src/Kernel/Extension/EntityBrowserTest.php b/tests/src/Kernel/Extension/EntityBrowserTest.php
index 8a102b7..dbf52df 100644
--- a/tests/src/Kernel/Extension/EntityBrowserTest.php
+++ b/tests/src/Kernel/Extension/EntityBrowserTest.php
@@ -13,6 +13,7 @@ use Drupal\entity_browser\WidgetInterface;
 use Drupal\entity_browser\WidgetSelectorInterface;
 use Drupal\entity_browser\SelectionDisplayInterface;
 use Drupal\KernelTests\KernelTestBase;
+use Drupal\user\Entity\User;
 use Drupal\views\Entity\View;
 
 /**
@@ -466,4 +467,41 @@ class EntityBrowserTest extends KernelTestBase {
     $this->assertEmpty($form_state->getErrors(), t('Validation succeeded where expected'));
   }
 
+  /**
+   * Tests view widget access.
+   */
+  public function testViewWidgetAccess() {
+    $this->installConfig(['entity_browser_test']);
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('user_role');
+
+    /** @var \Drupal\entity_browser\EntityBrowserInterface $entity */
+    $entity = $this->controller->load('test_entity_browser_file');
+
+    $this->assertFalse($entity->getWidget('774798f1-5ec5-4b63-84bd-124cd51ec07d')->access()->isAllowed());
+
+    // Create a user that has permission to access the view and try with it.
+    /** @var \Drupal\user\RoleInterface $role */
+    $role = $this->container->get('entity_type.manager')
+      ->getStorage('user_role')
+      ->create([
+        'name' => $this->randomString(),
+        'id' => $this->randomMachineName(),
+      ]);
+    $role->grantPermission('access content');
+    $role->save();
+
+    $user = $this->container->get('entity_type.manager')
+      ->getStorage('user')
+      ->create([
+        'name' => $this->randomString(),
+        'mail' => 'info@example.com',
+        'roles' => $role->id(),
+      ]);
+    $user->save();
+    \Drupal::currentUser()->setAccount($user);
+
+    $this->assertTrue($entity->getWidget('774798f1-5ec5-4b63-84bd-124cd51ec07d')->access()->isAllowed());
+  }
+
 }
