Como ignorar o node_access ao usar EntityFieldQuery?

12

Com o código a seguir, se o usuário atual não tiver 'ignorar acesso ao nó' (consulte _node_query_node_access_alter () para verificações exatas), a consulta procurará pelo node_access, mesmo que eu não use a marca "node_access".

Como evitar a verificação do node_access com a seguinte consulta para um usuário não administrador?

Estou usando esse código de um módulo, para poder verificar as permissões pessoalmente, sem necessidade de verificações do node_access.

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

Respostas:

26

O Drupal 7.15 permite ignorar o acesso no nó.

Consulte a tag de consulta DANGEROUS_ACCESS_CHECK_OPT_OUT adicionada ao EntityFieldQuery para obter mais informações.

Uma tag de consulta "DANGEROUS_ACCESS_CHECK_OPT_OUT" foi adicionada EntityFieldQuerypara permitir ignorar as verificações de acesso. Anteriormente, as consultas executadas EntityFieldQuerysempre eram alteradas pelo sistema de acesso ao nó, potencialmente causando comportamento inesperado e perda de dados.

Se você precisar ignorar as verificações de acesso em uma consulta interna na API do seu módulo, poderá adicionar essa tag, mas deve fazê-lo apenas se necessário. Se essa tag de consulta for adicionada a uma consulta cujos resultados serão exibidos ao usuário, ela ignorará todas as verificações de acesso, expondo potencialmente informações confidenciais.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}
user9221
fonte
Uau, eu estou ficando preso por isso há algum tempo agora, mesmo sem perceber. Adoro que seja "PERIGOSO" quando existem inúmeros usos inócuos para essas consultas. : P
Ryan Szrama
11

A resposta é que você não pode.

A única solução alternativa que posso pensar para adicionar accountmetadados:

$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: uma DANGEROUS_ACCESS_CHECK_OPT_OUTopção foi adicionada como parte da versão de segurança do Drupal 7.15.

Damien Tournoud
fonte
1
Parece uma boa solução alternativa, obrigado Damien!
Weboide