web-dev-qa-db-fra.com

Comment contourner node_access lors de l'utilisation de EntityFieldQuery?

Avec le code suivant, si l'utilisateur actuel n'a pas 'accès au nœud de contournement' (voir _ node_query_node_access_alter () pour les vérifications exactes), alors la requête vérifie node_access, même si je n'utilise pas le "node_access "tag.

Comment puis-je éviter la vérification node_access avec la requête suivante pour un utilisateur non administrateur?

J'utilise ce code à partir d'un module, donc je peux vérifier les autorisations moi-même, pas besoin de vérifications node_access.

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

Drupal 7.15 vous permet de contourner l'accès sur le nœud.

Voir DANGEROUS_ACCESS_CHECK_OPT_OUT balise de requête ajoutée à EntityFieldQuery pour plus d'informations.

Une balise de requête "DANGEROUS_ACCESS_CHECK_OPT_OUT" a été ajoutée à EntityFieldQuery pour permettre de contourner les vérifications d'accès. Auparavant, les requêtes exécutées via EntityFieldQuery étaient toujours modifiées par le système d'accès au nœud, ce qui pouvait entraîner un comportement inattendu et une perte de données.

Si vous devez contourner les vérifications d'accès dans une requête interne de l'API de votre module, vous pouvez ajouter cette balise, mais vous ne devez le faire que si cela est nécessaire. Si cette balise de requête est ajoutée à une requête dont les résultats seront affichés à l'utilisateur, elle contournera toutes les vérifications d'accès, exposant potentiellement des informations sensibles.

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

La réponse est que vous ne pouvez pas.

La seule solution de contournement à laquelle je peux penser pour ajouter une métadonnée account:

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

EDIT: a DANGEROUS_ACCESS_CHECK_OPT_OUT L'option a été ajoutée dans le cadre de la mise à jour de sécurité Drupal 7.15.

11
Damien Tournoud