EntityFieldQuery kullanırken node_access nasıl atlanır?


12

Aşağıdaki kodla, geçerli kullanıcının 'baypas düğümü erişimi' yoksa ( kesin doğrulama için _node_query_node_access_alter () işlevine sahip değilse ), sorgu "node_access" etiketini kullanmasam da sorgu node_access olup olmadığını denetler.

Yönetici olmayan bir kullanıcı için aşağıdaki sorgu ile node_access denetimini nasıl önleyebilirim?

Bu kodu bir modülden kullanıyorum, bu yüzden izinleri kendim doğrulayabilirim, node_access denetimlerine gerek yok.

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

Yanıtlar:


26

Drupal 7.15, düğümdeki erişimi atlamanıza olanak tanır.

Daha fazla bilgi için EntityFieldQuery'ye eklenen DANGEROUS_ACCESS_CHECK_OPT_OUT sorgu etiketine bakın .

EntityFieldQueryErişim denetimlerinin atlanmasına izin vermek için bir "DANGEROUS_ACCESS_CHECK_OPT_OUT" sorgu etiketi eklendi . Önceden, yapılan sorgular EntityFieldQuerydüğüm erişim sistemi tarafından her zaman değiştirilir ve bu da beklenmedik davranışlara ve veri kaybına neden olabilir.

Modülünüzün API'sındaki dahili bir sorgudaki erişim denetimlerini atlamanız gerekiyorsa, bu etiketi ekleyebilirsiniz, ancak bunu yalnızca gerekliyse yapmanız gerekir. Bu sorgu etiketi, sonuçları kullanıcıya görüntülenecek olan bir sorguya eklenirse, hassas bilgileri gösterme olasılığı bulunan tüm erişim denetimlerini atlar.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}

Vay canına, farkına bile varmadan bir süredir bunun tarafından takıldım. Bu tür sorgular için sayısız zararsız kullanım söz konusu olduğunda bunun "TEHLİKELİ" olduğunu seviyorum. : P
Ryan Szrama

11

Cevap, yapamayacağınızdır.

Bir accountmeta veri eklemek düşünebilirsiniz tek geçici çözüm :

$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: bir DANGEROUS_ACCESS_CHECK_OPT_OUTseçenek Drupal 7.15 güvenlik yayımı kapsamında eklenmiştir.


1
Bu iyi bir çözüm gibi görünüyor, teşekkürler Damien!
Weboide
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.