Як обійти 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();

Відповіді:


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();
}

Нічого собі, я зациклювався на цьому вже деякий час, навіть не усвідомлюючи цього. Любіть, що це "НЕБЕЗПЕЧНО", коли для таких запитів існує безліч нешкідливих цілей. : P
Ryan Szrama

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();

EDIT: DANGEROUS_ACCESS_CHECK_OPT_OUTопція була додана як частина випуску безпеки Drupal 7.15.


1
Це виглядає як вдале вирішення, дякую Дамієне!
Weboide
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.