it-swarm-ko.tech

EntityFieldQuery를 사용할 때 node_access를 우회하는 방법은 무엇입니까?

다음 코드를 사용하여 현재 사용자에게 '바이 패스 노드 액세스'가없는 경우 ( _ 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();
12
Weboide

Drupal 7.15를 사용하면 노드의 액세스를 무시할 수 있습니다.

자세한 내용은 EntityFieldQuery에 추가 된 DANGEROUS_ACCESS_CHECK_OPT_OUT 쿼리 태그 를 참조하십시오.

액세스 확인을 우회 할 수 있도록 "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();
}
26
user9221

대답은 당신이 할 수 없다는 것입니다.

내가 생각할 수있는 유일한 해결 방법은 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 보안 릴리스의 일부로 추가되었습니다.

11
Damien Tournoud