diff --git a/core/modules/field/src/FieldConfigAccessControlHandler.php b/core/modules/field/src/FieldConfigAccessControlHandler.php
index 6ee0e05..5e02686 100644
--- a/core/modules/field/src/FieldConfigAccessControlHandler.php
+++ b/core/modules/field/src/FieldConfigAccessControlHandler.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\field;
 
+use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityAccessControlHandler;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -17,16 +18,16 @@ class FieldConfigAccessControlHandler extends EntityAccessControlHandler {
    * {@inheritdoc}
    */
   protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
-    // Delegate access control to the underlying field storage config entity:
-    // the field config entity merely handles configuration for a particular
-    // bundle of an entity type, the bulk of the logic and configuration is with
-    // the field storage config entity. Therefore, if an operation is allowed on
-    // a certain field storage config entity, it should also be allowed for all
-    // associated field config entities.
-    // @see \Drupal\Core\Field\FieldDefinitionInterface
-    /** \Drupal\field\FieldConfigInterface $entity */
-    $field_storage_entity = $entity->getFieldStorageDefinition();
-    return $field_storage_entity->access($operation, $account, TRUE);
+    /** @var \Drupal\field\Entity\FieldConfig $entity */
+    $storage = $entity->getFieldStorageDefinition();
+    if ($operation === 'delete') {
+      if ($storage->isLocked()) {
+        return AccessResult::forbidden()->addCacheableDependency($storage);
+      } else {
+        return AccessResult::allowedIfHasPermission($account, 'administer ' . $entity->getTargetEntityTypeId() . ' fields')->addCacheableDependency($entity);
+      }
+    }
+    return AccessResult::allowedIfHasPermission($account, 'administer ' . $entity->getTargetEntityTypeId() . ' fields');
   }
 
 }
diff --git a/core/modules/field_ui/src/FieldConfigListBuilder.php b/core/modules/field_ui/src/FieldConfigListBuilder.php
index d0335c7..624aa9a 100644
--- a/core/modules/field_ui/src/FieldConfigListBuilder.php
+++ b/core/modules/field_ui/src/FieldConfigListBuilder.php
@@ -154,6 +154,12 @@ public function buildRow(EntityInterface $field_config) {
       ],
     ];
 
+    // If user does not have permission to edit the field,
+    // change the link into text.
+    if ($field_config->access('update') === FALSE) {
+      $row['data']['field_type'] = $row['data']['field_type']['data']['#title'];
+    }
+
     // Add the operations.
     $row['data'] = $row['data'] + parent::buildRow($field_config);
 
@@ -193,12 +199,14 @@ public function getDefaultOperations(EntityInterface $entity) {
       ];
     }
 
-    $operations['storage-settings'] = [
-      'title' => $this->t('Storage settings'),
-      'weight' => 20,
-      'attributes' => ['title' => $this->t('Edit storage settings.')],
-      'url' => $entity->toUrl("{$entity->getTargetEntityTypeId()}-storage-edit-form"),
-    ];
+    if ($entity->getFieldStorageDefinition()->access('update')) {
+      $operations['storage-settings'] = [
+        'title' => $this->t('Storage settings'),
+        'weight' => 20,
+        'attributes' => ['title' => $this->t('Edit storage settings.')],
+        'url' => $entity->urlInfo("{$entity->getTargetEntityTypeId()}-storage-edit-form"),
+      ];
+    }
 
     return $operations;
   }
