Bagaimana cara men-debug izin?

36

Bagaimana cara men-debug izin di Drupal 7?

Saya menggunakan core reporting, error logs, devel module error log, backtrace dan blok izin akses node tetapi kadang-kadang tidak cukup. Apa lagi yang harus saya periksa untuk mengetahui mengapa bidang, tampilan, atau blok tertentu tidak ditampilkan kepada pengguna?

Saya juga menemukan ada modul untuk Drupal 6 untuk melaporkan izin yang disebut tetapi tidak tersedia untuk Drupal 7.

Saya menggunakan berbagai modul pihak ketiga terkait izin:

 - 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
Refineo
sumber
Ini mungkin menjadi bagian penting dari pertanyaan Anda: Apakah Anda menggunakan modul akses contrib atau node kustom, seperti node_access ?
barista amatir
Catatan untuk diri sendiri: node_access tidak tersedia di D7, hanya D6. Tetapi mungkin ada modul izin lain yang terlibat.
barista amatir
@amateurbarista ya, saya menggunakan modul izin seperti yang saya sebutkan di PS2.
Refineo
Modul filter_perms adalah setara Drupal-7 dari modul permissions_report yang disebutkan di atas
Druvision

Jawaban:

21

Salah satu cara yang dapat Anda lakukan adalah membuat modul khusus, mencetak info akses pada setiap halaman, setiap node, setiap blok.

fungsi menu_get_item () mengembalikan item router yang memiliki properti access_arguments untuk halaman saat ini.

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

Kemudian Anda dapat hook_page_alter, untuk menampilkan info akses di atas setiap halaman.

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

Selanjutnya Anda dapat menampilkan info izin blokir seperti ini:

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

Dan seterusnya, pada dasarnya konsep yang sama, Anda dapat melakukan hal yang sama untuk simpul, bentuk, pandangan. Semoga ini membantu.

gilzero
sumber
Ketika argumen akses yourmodule_get_page_access()tidak masuk akal, Anda dapat melihat $router_item['access_callback']dan kemudian mencari fungsi dengan nama itu di modul yang relevan untuk melihat apa yang terjadi di sana. Jawaban yang bagus
Wtower
7

Edit file utama modul Pengguna; temukan user_access()fungsinya, tambahkan 2 baris sebelum returnpernyataan, dan pantau log kesalahan 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]);
temoto
sumber
Ini sebenarnya cukup bagus. Bagaimana dengan men-debug izin Field?
Michal Przybylowicz
Saya melihat nilai dalam drush, tetapi drush tidak tahu siapa pengguna. Tapi itu tidak muncul di halaman yang ditentukan di hook_menu. Tidak yakin mengapa tidak.
sam452
error_logtidak menampilkan ke layar. Untuk instalasi saya, itu menulis ke log kesalahan apache. php.net/manual/en/function.error-log.php
Ryre
5

Sepertinya Anda sudah memiliki semua alat berbasis GUI untuk memecahkan masalah izin. Satu trik lebih maju (dan mungkin lebih sulit) yang saya gunakan secara efektif di masa lalu adalah:

  1. Bangun Tampilan dengan bidang, peran, tipe simpul, dll. Yang ingin saya uji.
  2. Aktifkan "tampilkan kueri" pada halaman Opsi opsi lanjutan.
  3. Jalankan tampilan dan tempelkan kueri SQL ke editor SQL berbasis GUI seperti Navicat (komersial) atau MySQL Workbench (gratis).
  4. Lihat node apa yang tidak muncul.
  5. Tweak kueri dengan kebutuhan Anda.

Saya banyak kasus permintaan yang dimuntahkan Views agak kompleks (shock penuh bergabung) dan untuk membangun mereka secara manual akan mengambil sedikit lebih banyak waktu (ditambah itu akan sedikit lebih rawan kesalahan). Juga pendekatan ini memastikan bahwa Anda menguji terhadap apa yang dilihat pengguna. Jika Anda memiliki modul izin yang diaktifkan (yang memanfaatkan izin inti Drupal), tabel mereka akan muncul di kueri yang digunakan oleh Views. Setelah saya mendapatkan kueri ini, saya mengubahnya untuk menunjukkan berapa banyak node tipe konten x yang diizinkan untuk peran x, misalnya. Ini seakurat dan berbutir halus seperti yang bisa didapat dari pelaporan. Dan itu adalah laporan "tingkat lanjut" saya.

barista amatir
sumber
2

Dengan Drupal saya harus menggunakan debugger beberapa kali (xdebug dengan netbeans). Banyak fungsi yang disebut secara tidak langsung membuat hampir tidak mungkin untuk mengikuti apa yang sebenarnya ditambahkan secara global dengan hanya membaca kode, mencetak backtrace atau memeriksa hasil akhir.

gagarine
sumber