Làm cách nào để bỏ qua node_access khi sử dụng EntityFieldQuery?


12

Với đoạn mã sau, nếu người dùng hiện tại không có 'bypass access access' (xem _node_query_node_access_alter () để xác minh chính xác), thì truy vấn sẽ kiểm tra node_access, mặc dù tôi không sử dụng thẻ "node_access".

Làm cách nào để tránh kiểm tra node_access bằng truy vấn sau đây cho người dùng không phải là quản trị viên?

Tôi đang sử dụng mã này từ một mô-đun, vì vậy tôi có thể tự xác minh quyền, không cần kiểm tra node_access.

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

Câu trả lời:


26

Drupal 7.15 cho phép bạn bỏ qua quyền truy cập vào nút.

Xem thẻ truy vấn DANGEROUS_ACCESS_CHECK_OPT_OUT được thêm vào EntityFieldQuery để biết thêm thông tin.

Thẻ truy vấn "DANGEROUS_ACCESS_CHECK_OPT_OUT" đã được thêm vào EntityFieldQueryđể cho phép bỏ qua kiểm tra truy cập. Trước đây, các truy vấn được thực hiện thông qua EntityFieldQuerysẽ luôn bị hệ thống truy cập nút thay đổi, có khả năng gây ra hành vi và mất dữ liệu không mong muốn.

Nếu bạn cần bỏ qua kiểm tra truy cập trong truy vấn nội bộ trong API của mô-đun, bạn có thể thêm thẻ này, nhưng bạn chỉ nên làm như vậy nếu cần thiết. Nếu thẻ truy vấn này được thêm vào truy vấn có kết quả sẽ được hiển thị cho người dùng, nó sẽ bỏ qua tất cả các kiểm tra truy cập, có khả năng lộ thông tin nhạy cảm.

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

Wow, tôi đã bị mắc kẹt bởi điều này một thời gian mà không nhận ra nó. Yêu rằng đó là "NGUY HIỂM" khi có vô số cách sử dụng vô hại cho các truy vấn đó. : P
Ryan Szrama

11

Câu trả lời là bạn không thể.

Cách giải quyết duy nhất tôi có thể nghĩ về nó để thêm accountsiêu dữ liệu:

$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: một DANGEROUS_ACCESS_CHECK_OPT_OUTtùy chọn đã được thêm vào như một phần của bản phát hành bảo mật Drupal 7.15.


1
Có vẻ như một cách giải quyết tốt, cảm ơn Damien!
Weboide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.