ฉันจะดีบักสิทธิ์ได้อย่างไร


36

ฉันจะดีบักการอนุญาตใน Drupal 7 ได้อย่างไร

ฉันใช้การรายงานหลักบันทึกข้อผิดพลาดบันทึกข้อผิดพลาดของโมดูล devel ย้อนหลังและบล็อกสิทธิ์การเข้าถึงโหนด แต่บางครั้งก็ไม่เพียงพอ ฉันควรตรวจสอบอะไรอีกเพื่อดูว่าเหตุใดบางมุมมองหรือบล็อกบางรายการจึงไม่ปรากฏต่อผู้ใช้

ฉันยังพบว่ามีโมดูลสำหรับ Drupal 6สำหรับการรายงานสิทธิ์ที่เรียกว่า แต่มันไม่สามารถใช้ได้สำหรับ Drupal 7

ฉันใช้โมดูลบุคคลที่สามที่เกี่ยวข้องกับการอนุญาตต่างๆ:

 - 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

นี่อาจเป็นส่วนสำคัญของคำถามของคุณ: คุณใช้ contrib หรือโมดูลการเข้าถึงโหนดที่กำหนดเองเช่นnode_accessหรือไม่
บาริสต้ามือสมัครเล่น

หมายเหตุสำหรับตนเอง: node_access ไม่สามารถใช้ได้ใน D7 เพียง D6 แต่อาจมีโมดูลการอนุญาตอื่น ๆ ที่เกี่ยวข้อง
บาริสต้ามือสมัครเล่น

@amateurbarista ใช่ฉันใช้โมดูลสิทธิ์ตามที่ระบุไว้ใน PS2
ปรับแต่ง

โมดูล filter_perms เป็น Drupal-7 เทียบเท่าโมดูล permissions_report ดังกล่าวข้างต้น
Druvision

คำตอบ:


21

วิธีหนึ่งที่คุณสามารถทำได้คือสร้างโมดูลที่กำหนดเองพิมพ์ข้อมูลการเข้าถึงในทุกหน้าทุกโหนดทุกบล็อค

menu_get_item () ฟังก์ชันส่งคืนรายการเราเตอร์ที่มีคุณสมบัติ access_arguments สำหรับหน้าปัจจุบัน

/**
 * 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;
  }
}

จากนั้นคุณสามารถ hook_page_alter เพื่อแสดงข้อมูลการเข้าถึงที่ด้านบนของทุกหน้า

/**
 * 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;
}

ถัดไปคุณสามารถแสดงข้อมูลการอนุญาตบล็อกเช่นนี้:

/**
 * 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;
}

และโดยทั่วไปแล้วแนวคิดเดียวกันคุณสามารถทำเช่นเดียวกันกับโหนดรูปแบบมุมมอง หวังว่านี่จะช่วยได้


เมื่ออาร์กิวเมนต์การเข้าถึงyourmodule_get_page_access()ไม่สมเหตุสมผลคุณสามารถดู$router_item['access_callback']และค้นหาฟังก์ชันด้วยชื่อนั้นในโมดูลที่เกี่ยวข้องเพื่อดูว่าเกิดอะไรขึ้นในนั้น คำตอบที่ดี
Wtower

7

แก้ไขไฟล์หลักโมดูลผู้ใช้ ค้นหาuser_access()ฟังก์ชั่นเพิ่ม 2 บรรทัดก่อนreturnคำสั่งและตรวจสอบบันทึกข้อผิดพลาด 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]);

อันนี้จริง ๆ แล้วค่อนข้างดี วิธีการเกี่ยวกับการแก้ปัญหาสิทธิ์ฟิลด์?
Michal Przybylowicz

ฉันเห็นค่าเป็น drush แต่ drush ไม่ทราบว่าผู้ใช้คือใคร แต่มันไม่ปรากฏบนหน้าที่กำหนดใน hook_menu ไม่แน่ใจว่าทำไม
sam452

error_logไม่ส่งออกไปยังหน้าจอ สำหรับการติดตั้งของฉันมันเขียนไว้ในบันทึกข้อผิดพลาด apache php.net/manual/en/function.error-log.php
Ryre

5

ดูเหมือนว่าคุณมีเครื่องมือที่ใช้ GUI ทั้งหมดแล้วในการแก้ไขปัญหาการอนุญาต เคล็ดลับขั้นสูงอีกหนึ่ง (และอาจจะยากกว่า) เคล็ดลับที่ฉันเคยใช้อย่างมีประสิทธิภาพในอดีตคือ:

  1. สร้างมุมมองด้วยฟิลด์บทบาทโหนดชนิด ฯลฯ ที่ฉันต้องการทดสอบ
  2. เปิดใช้งาน "คิวรีแสดงผล" ในหน้าตัวเลือกขั้นสูงของ Views
  3. ดำเนินการมุมมองและวางแบบสอบถาม SQL ลงในตัวแก้ไข SQL ที่ยึดตาม GUI เช่น Navicat (เชิงพาณิชย์) หรือ MySQL Workbench (ฟรี)
  4. ดูว่าโหนดใดไม่แสดง
  5. ปรับแต่งแบบสอบถามตามความต้องการของคุณ

ฉันมีหลายกรณีที่ข้อความค้นหาที่แยกออกจากการดูค่อนข้างซับซ้อน (ช็อตเต็มไปด้วยการรวม) และการสร้างด้วยตนเองจะใช้เวลาเพิ่มอีกนิดหน่อย นอกจากนี้วิธีการนี้ช่วยให้มั่นใจได้ว่าคุณกำลังทดสอบกับสิ่งที่ผู้ใช้เห็น หากคุณเปิดใช้งานโมดูลการอนุญาตใด ๆ (ซึ่งใช้ประโยชน์จากสิทธิ์หลักของ Drupal) การรวมตารางของพวกเขาจะปรากฏในแบบสอบถามที่ใช้โดย Views เมื่อฉันได้รับแบบสอบถามนี้ฉันปรับแต่งมันเพื่อแสดงจำนวนโหนดของประเภทเนื้อหา x ที่ได้รับอนุญาตสำหรับบทบาท x เช่น มันแม่นยำและละเอียดมากเท่าที่การรายงานจะได้รับ และนี่คือรายงาน "ขั้นสูง" ของฉัน


2

ด้วย Drupal ฉันต้องใช้ดีบักเกอร์บางครั้ง (xdebug กับ netbeans) ฟังก์ชันจำนวนมากถูกเรียกโดยอ้อมทำให้แทบเป็นไปไม่ได้ที่จะทำตามสิ่งที่ผนวกเข้าด้วยกันทั่วโลกโดยการอ่านโค้ดพิมพ์ backtrace หรือตรวจสอบผลลัพธ์สุดท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.