diff --git a/plugins/services_entity_resource.inc b/plugins/services_entity_resource.inc
index 2466be2..9564972 100644
--- a/plugins/services_entity_resource.inc
+++ b/plugins/services_entity_resource.inc
@@ -10,7 +10,7 @@ class ServicesEntityResourceController implements ServicesResourceControllerInte
    */
   public function access($op, $args) {
     if ($op == 'index') {
-      // Access is handled at the query level.
+      // Access is handled per-entity by index().
       return TRUE;
     }
     if ($op == 'create') {
@@ -104,7 +104,9 @@ class ServicesEntityResourceController implements ServicesResourceControllerInte
     $entities = entity_load($entity_type, array_keys($result[$entity_type]));
 
     foreach ($entities as $id => $entity) {
-      $return[] = $this->limit_fields($entity, $fields);
+      if (entity_access('view', $entity_type, $entity)) {
+        $return[] = $this->limit_fields($entity, $fields);
+      }
     }
 
     return $return;
@@ -135,8 +137,10 @@ class ServicesEntityResourceController implements ServicesResourceControllerInte
       $entities = $return;
       $return = array();
 
-      foreach($entities as $id => $entity) {
-        $return[] = $this->limit_fields($entity, $fields);
+      foreach ($entities as $id => $entity) {
+        if (entity_access('view', $entity_type, $entity)) {
+          $return[] = $this->limit_fields($entity, $fields);
+        }
       }
     }
 
diff --git a/plugins/services_entity_resource_clean.inc b/plugins/services_entity_resource_clean.inc
index 256f001..39746ba 100644
--- a/plugins/services_entity_resource_clean.inc
+++ b/plugins/services_entity_resource_clean.inc
@@ -66,6 +66,8 @@ class ServicesEntityResourceControllerClean extends ServicesEntityResourceContro
     $property_info = entity_get_all_property_info($entity_type);
     $parameters = $this->transform_values($entity_type, $property_info, $parameters);
     $sort = (isset($property_info['field_' . $sort]))?'field_' . $sort:$sort;
+
+    // Call the parent method, which takes care of access control.
     $entities = parent::index($entity_type, '*', $parameters, $page, $pagesize, $sort, $direction);
     foreach($entities as $entity) {
       $return[] = $this->get_data(entity_metadata_wrapper($entity_type, $entity), $fields);
@@ -84,6 +86,7 @@ class ServicesEntityResourceControllerClean extends ServicesEntityResourceContro
 
     $field_name = preg_replace('/^field_/', '', $field_name);
 
+    // The metadata wrapper checks entity_access() on each entity in the field.
     $return = $this->get_data(entity_metadata_wrapper($entity_type, $entity), $field_name);
     return $return;
   }
diff --git a/plugins/services_entity_resource_recurse.inc b/plugins/services_entity_resource_recurse.inc
index 5a87e43..064e77e 100644
--- a/plugins/services_entity_resource_recurse.inc
+++ b/plugins/services_entity_resource_recurse.inc
@@ -83,6 +83,10 @@ class ServicesEntityResourceControllerRecurse extends ServicesEntityResourceCont
       if (isset($entities[$partial_entity->entity_type][$partial_entity->entity_id])) {
         $entity = $entities[$partial_entity->entity_type][$partial_entity->entity_id];
 
+        if (!entity_access('view', $entity_type, $entity)) {
+          continue;
+        }
+
         $wrapper = entity_metadata_wrapper($partial_entity->entity_type, $entity);
         $entity_result = (object) $this->prepare_structure($wrapper, $fields);
         if (!empty($entity_result)) {
