Wie kann man node_access umgehen, wenn man EntityFieldQuery verwendet?


12

Wenn der aktuelle Benutzer mit dem folgenden Code keinen 'Bypass-Knotenzugriff' hat ( genaue Überprüfungen siehe _node_query_node_access_alter () ), sucht die Abfrage nach node_access, obwohl ich das Tag "node_access" nicht verwende.

Wie kann ich die Überprüfung von node_access mit der folgenden Abfrage für einen Benutzer ohne Administratorrechte vermeiden?

Ich verwende diesen Code aus einem Modul, damit ich die Berechtigungen selbst überprüfen kann, ohne dass Node_access-Überprüfungen erforderlich sind.

  $query = new EntityFieldQuery;
  $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'foo')
    ->fieldCondition('custom_id', 'value', $custom_id)
    ->execute();

Antworten:


26

Mit Drupal 7.15 können Sie den Zugriff auf den Knoten umgehen.

Weitere Informationen finden Sie unter DANGEROUS_ACCESS_CHECK_OPT_OUT-Abfragetag, das zu EntityFieldQuery hinzugefügt wurde .

Ein Abfragetag "DANGEROUS_ACCESS_CHECK_OPT_OUT" wurde hinzugefügt, EntityFieldQueryum die Umgehung von Zugriffsprüfungen zu ermöglichen. Bisher wurden Abfragen, die ausgeführt wurden EntityFieldQuery, immer vom Knotenzugriffssystem geändert, was möglicherweise zu unerwartetem Verhalten und Datenverlust führte.

Wenn Sie Zugriffsprüfungen in einer internen Abfrage in der API Ihres Moduls umgehen müssen, können Sie dieses Tag hinzufügen, dies sollte jedoch nur erfolgen, wenn dies erforderlich ist. Wenn dieses Abfragetag zu einer Abfrage hinzugefügt wird, deren Ergebnisse dem Benutzer angezeigt werden, werden alle Zugriffsprüfungen umgangen, wodurch möglicherweise vertrauliche Informationen angezeigt werden.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}

Wow, ich bin schon seit einiger Zeit dabei, ohne es zu merken. Ich liebe es, dass es "GEFÄHRLICH" ist, wenn es unzählige harmlose Verwendungszwecke für solche Abfragen gibt. : P
Ryan Szrama

11

Die Antwort ist, dass Sie nicht können.

Die einzige Problemumgehung, die ich mir vorstellen kann, um accountMetadaten hinzuzufügen :

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'foo')
  ->fieldCondition('custom_id', 'value', $custom_id)
  ->addMetaData('account', user_load(1))
  ->execute();

BEARBEITEN: Im DANGEROUS_ACCESS_CHECK_OPT_OUTRahmen der Sicherheitsversion von Drupal 7.15 wurde eine Option hinzugefügt.


1
Das sieht nach einer guten Problemumgehung aus, danke Damien!
Weboide
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.