Làm cách nào để gỡ lỗi?


36

Làm cách nào để gỡ lỗi quyền trong Drupal 7?

Tôi sử dụng báo cáo cốt lõi, nhật ký lỗi, nhật ký lỗi mô-đun phát, backtrace và khối quyền truy cập nút nhưng đôi khi nó không đủ. Những gì khác tôi nên kiểm tra để tìm hiểu tại sao các trường, chế độ xem hoặc khối nhất định không hiển thị cho người dùng?

Tôi cũng thấy có một mô-đun cho Drupal 6 để báo cáo về các quyền được gọi nhưng nó không có sẵn cho Drupal 7.

Tôi đang sử dụng các mô-đun bên thứ ba liên quan đến quyền:

 - devel node access 7.x-1.x-dev 
 - fast permissions administration 7.x-2.0
 - organic groups access control 7.x-1.x 
 - profile2 group access 7.x-1.x-dev 
 - ur-node access 7.x-1.x-dev

Đây có thể là một phần quan trọng trong câu hỏi của bạn: Bạn có đang sử dụng bất kỳ mô-đun truy cập nút tùy chỉnh hoặc nút tùy chỉnh nào, chẳng hạn như node_access không?
barista nghiệp dư

Lưu ý đến bản thân: node_access không có sẵn trong D7, chỉ D6. Nhưng có thể có các mô-đun cho phép khác liên quan.
barista nghiệp dư

@am Nghiệpbarista vâng, tôi đang sử dụng các mô-đun cấp phép như tôi đã đề cập trong PS2.
Refineo

Mô-đun filter_perms tương đương với Drupal-7 của mô-đun
allow_Vport

Câu trả lời:


21

Một cách bạn có thể làm là tạo một mô-đun tùy chỉnh, in thông tin truy cập trên mọi trang, mọi nút, mọi khối.

Hàm menu_get_item () trả về một mục bộ định tuyến có thuộc tính access_argument cho trang hiện tại.

/**
 * Show access permission of current page.
 */
function yourmodule_get_page_access() {

  $router_item = menu_get_item();
  if ($router_item) {

    $access_arguments = unserialize($router_item['access_arguments']);

    $arguments = array();
    foreach ($access_arguments as $access_argument) {
      $arguments[] = $access_argument;
    }
    if ($arguments) {
      $output  = '<p>';
      $output .= t('This page needs user to have %p permission(s) to access', array(
        '%p' => implode(', ', $arguments),
      ));
      $output .= '</p>';
    }
    else {
      $output = '<p>' . t('This page needs no user permissions') . ' </p>';
    }
    return $output;
  }
}

Sau đó, bạn có thể hook_page_alter, để hiển thị thông tin truy cập trên đầu mỗi trang.

/**
 * Implements hook_page_alter().
 *
 * Display access information on top of every page.
 */
function yourmodule_page_alter(&$page) {

  // Make a new area on top of the page for displaying access information.
  $page['content']['theverytop']['#markup'] = yourmodule_get_page_access();
  $page['content']['theverytop']['#weight'] = -10;
  $page['content']['#sorted'] = FALSE;
}

Tiếp theo, bạn có thể hiển thị thông tin cấp phép khối như thế này:

/**
 * Implement hook_block_alter
 *
 * To display block permission information to the block title.
 */

function yourmodule_block_view_alter(&$data, $block) {
  $delta = $block->delta;
  $output = '';

  $rid = db_query("SELECT rid FROM {block_role} WHERE delta = :delta", array(':delta' => $delta))->fetchCol();

  if (empty($rid)) {
      $output = ' This block does not have any role permission restriction.';
  } else {
      $output = ' This block is viewable for users have role(s): ';
      foreach ($rid as $role_id) {
          $rolename = db_query("SELECT name from {role} where rid = :rid", array(':rid' => $role_id))->fetchField();
          $output .= $rolename . ' ';
      }
  }

  // append the permission info to block title for every block
  $block->title .= $output;
}

Và như vậy, về cơ bản cùng một khái niệm, bạn có thể làm tương tự với nút, biểu mẫu, dạng xem. Hi vọng điêu nay co ich.


Khi các đối số truy cập yourmodule_get_page_access()không có ý nghĩa, bạn có thể xem $router_item['access_callback']và sau đó tìm kiếm hàm có tên đó trong các mô-đun có liên quan để xem xét những gì đang diễn ra ở đó. Câu trả lời chính xác.
Wtower

7

Chỉnh sửa tập tin chính mô-đun người dùng; tìm user_access()hàm, thêm 2 dòng trước returncâu lệnh và theo dõi nhật ký lỗi PHP.

$granted = isset($perm[$account->uid][$string]);
error_log(sprintf('--- user_access: %s "%s" = %s', $account->name, $string, $granted ? 'yes' : 'no'));
return isset($perm[$account->uid][$string]);

Điều này thực sự là khá tốt. Làm thế nào về quyền gỡ lỗi Trường?
Michal Przybylowicz

Tôi thấy các giá trị trong drush, nhưng drush không biết người dùng là ai. Nhưng nó không xuất hiện trên trang được xác định trong hook_menu. Không chắc chắn tại sao không.
sam52

error_logkhông xuất ra màn hình. Để cài đặt của tôi, nó đã ghi vào nhật ký lỗi apache. php.net/manual/en/function.error-log.php
Ryre

5

Có vẻ như bạn đã có tất cả các công cụ dựa trên GUI để khắc phục sự cố. Một mẹo nâng cao hơn (và có thể khó hơn) tôi đã sử dụng hiệu quả trong quá khứ là:

  1. Xây dựng Chế độ xem với các trường, vai trò, loại nút, v.v. mà tôi muốn kiểm tra.
  2. Bật "truy vấn hiển thị" trên trang Tùy chọn nâng cao.
  3. Thực thi Chế độ xem và dán truy vấn SQL vào trình soạn thảo SQL dựa trên GUI như Navicat (thương mại) hoặc MySQL Workbench (miễn phí).
  4. Xem những gì các nút không hiển thị.
  5. Tinh chỉnh các truy vấn theo nhu cầu của bạn.

Tôi rất nhiều trường hợp các truy vấn mà Lượt xem nhổ ra khá phức tạp (sốc toàn bộ các phép nối) và để xây dựng chúng theo cách thủ công sẽ mất thêm một chút thời gian (cộng với đó sẽ dễ bị lỗi hơn một chút). Ngoài ra phương pháp này đảm bảo rằng bạn đang kiểm tra đối với những gì người dùng đang nhìn thấy. Nếu bạn có bất kỳ mô-đun quyền nào được bật (sử dụng quyền truy cập lõi Drupal), các phép nối bảng của chúng sẽ hiển thị trong truy vấn được sử dụng bởi Lượt xem. Khi tôi nhận được truy vấn này, tôi điều chỉnh nó để hiển thị có bao nhiêu nút thuộc loại nội dung x được phép cho vai trò x, chẳng hạn. Đó là chính xác và chi tiết như báo cáo có thể nhận được. Và đó là những báo cáo "nâng cao" của tôi.


2

Với Drupal, tôi phải sử dụng trình gỡ lỗi một số lần (xdebug với netbeans). Rất nhiều chức năng được gọi là gián tiếp khiến hầu như không thể theo dõi những gì thực sự nối thêm trên toàn cầu bằng cách chỉ đọc mã, in một backtrace hoặc kiểm tra đầu ra cuối cùng.

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.