Как обойти node_access при использовании EntityFieldQuery?

12

С помощью следующего кода, если текущий пользователь не имеет «обходного доступа к узлу» (см. _Node_query_node_access_alter () для точных проверок), тогда запрос проверяет наличие node_access, даже если я не использую тег «node_access».

Как можно избежать проверки node_access с помощью следующего запроса для пользователя без прав администратора?

Я использую этот код из модуля, поэтому я могу самостоятельно проверять права доступа, нет необходимости проверять node_access.

  $query = new EntityFieldQuery;
  $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'foo')
    ->fieldCondition('custom_id', 'value', $custom_id)
    ->execute();
Weboide
источник

Ответы:

26

Drupal 7.15 позволяет обойти доступ на узле.

См. Тег запроса DANGEROUS_ACCESS_CHECK_OPT_OUT, добавленный в EntityFieldQuery, для получения дополнительной информации.

Был добавлен тег запроса «DANGEROUS_ACCESS_CHECK_OPT_OUT», EntityFieldQueryчтобы разрешить обход проверок доступа. Ранее запросы, выполняемые через EntityFieldQuery, всегда изменялись системой доступа к узлам, что потенциально могло привести к неожиданному поведению и потере данных.

Если вам нужно обойти проверки доступа во внутреннем запросе в API вашего модуля, вы можете добавить этот тег, но вы должны делать это только в случае необходимости. Если этот тег запроса добавляется к запросу, результаты которого будут отображаться для пользователя, он будет пропускать все проверки доступа, что потенциально может раскрыть конфиденциальную информацию.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}
user9221
источник
Вау, я застрял в этом некоторое время, даже не осознавая этого. Любите, что это "ОПАСНО", когда есть неисчислимое безобидное использование для таких запросов. : P
Райан Шрама
11

Ответ в том, что вы не можете.

Единственный обходной путь, который я могу придумать, это добавить 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();

РЕДАКТИРОВАТЬ: DANGEROUS_ACCESS_CHECK_OPT_OUTопция была добавлена ​​как часть выпуска безопасности Drupal 7.15.

Дэмиен Турноуд
источник
1
Это похоже на хороший обходной путь, спасибо Дэмиен!
Weboide