Jak ominąć dostęp do węzła podczas korzystania z EntityFieldQuery?

12

W przypadku następującego kodu, jeśli bieżący użytkownik nie ma „pomijania dostępu do węzła” ( dokładne weryfikacje znajdują się w _node_query_node_access_alter () ), wówczas zapytanie sprawdza , czy węzeł dostępu jest dostępny, mimo że nie używam znacznika „node_access”.

Jak mogę uniknąć sprawdzania dostępu do węzła za pomocą następującego zapytania dla użytkownika niebędącego administratorem?

Używam tego kodu z modułu, więc mogę samodzielnie zweryfikować uprawnienia, bez potrzeby sprawdzania dostępu do węzła.

  $query = new EntityFieldQuery;
  $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'foo')
    ->fieldCondition('custom_id', 'value', $custom_id)
    ->execute();
Weboide
źródło

Odpowiedzi:

26

Drupal 7.15 pozwala na ominięcie dostępu do węzła.

Aby uzyskać więcej informacji, zobacz tag zapytania DANGEROUS_ACCESS_CHECK_OPT_OUT dodany do EntityFieldQuery .

Dodano tag zapytania „DANGEROUS_ACCESS_CHECK_OPT_OUT”, EntityFieldQueryaby umożliwić ominięcie kontroli dostępu. Poprzednio wykonywane zapytania EntityFieldQueryzawsze były zmieniane przez system dostępu do węzła, potencjalnie powodując nieoczekiwane zachowanie i utratę danych.

Jeśli chcesz ominąć kontrole dostępu w zapytaniu wewnętrznym w interfejsie API modułu, możesz dodać ten znacznik, ale powinieneś to zrobić tylko wtedy, gdy jest to konieczne. Jeśli ten tag zapytania zostanie dodany do zapytania, którego wyniki zostaną wyświetlone użytkownikowi, obejdzie wszystkie kontrole dostępu, potencjalnie ujawniając poufne informacje.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}
użytkownik9221
źródło
Wow, utknąłem w tym od jakiegoś czasu, nawet nie zdając sobie z tego sprawy. Uwielbiam to, że jest to „NIEBEZPIECZNE”, gdy takie zapytania są niezliczone i nieszkodliwe. : P
Ryan Szrama,
11

Odpowiedź brzmi: nie możesz.

Jedyne obejście, jakie mogę wymyślić, aby dodać accountmetadane:

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

EDYCJA: dodano DANGEROUS_ACCESS_CHECK_OPT_OUTopcję w ramach wydania bezpieczeństwa Drupal 7.15.

Damien Tournoud
źródło
1
To wygląda na dobre obejście, dziękuję Damien!
Weboide,