¿Cómo omitir node_access cuando se usa EntityFieldQuery?

12

Con el siguiente código, si el usuario actual no tiene 'omitir el acceso al nodo' (consulte _node_query_node_access_alter () para verificaciones exactas), entonces la consulta verifica el nodo_acceso, aunque no use la etiqueta "node_access".

¿Cómo puedo evitar la verificación node_access con la siguiente consulta para un usuario que no sea administrador?

Estoy usando este código de un módulo, por lo que puedo verificar los permisos yo mismo, sin necesidad de comprobaciones de node_access.

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

Respuestas:

26

Drupal 7.15 le permite omitir el acceso en el nodo.

Consulte la etiqueta de consulta DANGEROUS_ACCESS_CHECK_OPT_OUT agregada a EntityFieldQuery para obtener más información.

Se ha agregado una etiqueta de consulta "DANGEROUS_ACCESS_CHECK_OPT_OUT" EntityFieldQuerypara permitir eludir las verificaciones de acceso. Anteriormente, EntityFieldQueryel sistema de acceso a nodos siempre modificaba las consultas ejecutadas , lo que podría causar un comportamiento inesperado y pérdida de datos.

Si necesita evitar las verificaciones de acceso en una consulta interna dentro de la API de su módulo, puede agregar esta etiqueta, pero solo debe hacerlo si es necesario. Si esta etiqueta de consulta se agrega a una consulta cuyos resultados se mostrarán al usuario, omitirá todas las comprobaciones de acceso, exponiendo potencialmente información confidencial.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}
usuario9221
fuente
Wow, me he quedado atrapado por esto por algún tiempo sin siquiera darme cuenta. Me encanta que sea "PELIGROSO" cuando hay innumerables usos inocuos para tales consultas. : P
Ryan Szrama
11

La respuesta es que no puedes.

La única solución que se me ocurre es agregar un accountmetadato:

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

EDITAR: DANGEROUS_ACCESS_CHECK_OPT_OUTse ha agregado una opción como parte de la versión de seguridad Drupal 7.15.

Damien Tournoud
fuente
1
Parece una buena solución, ¡gracias Damien!
Weboide