İzinleri nasıl hata ayıklarım?


36

Drupal 7'deki izinleri nasıl hata ayıklarım?

Çekirdek raporlama, hata günlükleri, devel modül hata günlükleri, geri izleme ve düğüm erişim izni bloğu kullanıyorum ancak bazen yeterli olmuyor. Belirli alanların, görünümlerin veya blokların neden kullanıcıya gösterilmediğini öğrenmek için başka neleri kontrol etmeliyim?

Ayrıca Drupal 6 için çağrılan izinleri bildiren bir modül olduğunu gördüm ancak Drupal 7 için mevcut değil.

Üçüncü taraf modüllerle ilgili çeşitli izinler kullanıyorum:

 - 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

Bu, sorunuzun önemli bir parçası olabilir: node_access gibi herhangi bir katkıda bulunan veya özel düğüm erişim modülünü kullanıyor musunuz?
amatör barista

Kendime not: node_access D7'da mevcut değildir, sadece D6. Ancak ilgili başka izin modülleri olabilir.
amatör barista

@ amatörbarista evet, PS2'de bahsettiğim gibi izin modülleri kullanıyorum.
Refineo,

Filter_perms modülü, yukarıda belirtilen permissions_report modülünün bir Drupal-7 eşdeğeridir
Druvision

Yanıtlar:


21

Yapabilmenizin bir yolu, özel bir modül oluşturmak, her sayfaya, her düğüme, her bloğa erişim bilgilerini yazdırmaktır.

menu_get_item () işlevi, geçerli sayfa için access_arguments özelliğine sahip bir yönlendirici öğesi döndürür.

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

Ardından, erişim bilgilerini her sayfanın üstünde görüntülemek için hook_page_alter yapabilirsiniz.

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

Sonra buna benzer blok izin bilgilerini gösterebilirsiniz:

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

Ve böylece, temelde aynı kavram, aynı şeyi düğümleme, biçimlendirme, görünümler için de yapabilirsiniz. Bu yardımcı olur umarım.


Erişim argümanları bir yourmodule_get_page_access()anlam ifade etmiyorsa, orada olup bitene bakmak $router_item['access_callback']için ilgili modüllerde bu adı taşıyan işlevi arayabilir ve arayabilirsiniz. Mükemmel cevap.
Wtower

7

Kullanıcı modülü ana dosyasını düzenleyin; user_access()işlevi bulun, returnifadeden önce 2 satır ekleyin ve PHP hata günlüğünü izleyin.

$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]);

Bu aslında oldukça iyi. Alan izinlerinde hata ayıklamaya ne dersiniz?
Michal Przybylowicz

Drush'taki değerleri görüyorum, ancak drush kullanıcının kim olduğunu bilmiyor. Ancak hook_menu'da tanımlanan sayfada görünmüyor. Emin değil neden olmasın.
sam452

error_logekrana çıkış yapmaz. Kurulumu için apache hata günlüğüne yazdı. php.net/manual/en/function.error-log.php
Ryre

5

İzinleri gidermek için tüm GUI tabanlı araçlara sahipmişsiniz gibi görünüyor. Geçmişte etkili bir şekilde kullandığım bir tane daha ileri düzey (ve muhtemelen daha zor) bir numara:

  1. Test etmek istediğim alanlar, roller, düğüm türleri vb. İle bir Görünüm oluşturun.
  2. Gelişmiş görünümler sayfasında "görüntü sorgusunu" etkinleştirin.
  3. Görünümü yürütün ve SQL sorgusunu Navicat (commercial) veya MySQL Workbench (free) gibi bir GUI tabanlı SQL editörüne yapıştırın.
  4. Hangi düğümlerin görünmediğini görün.
  5. Sorgunuzu ihtiyaçlarınıza göre ayarlayın.

Çoğu durumda, Görünümlerin tükettiği sorgular oldukça karmaşıktır (birleşme şokuyla doludur) ve bunları manuel olarak oluşturmak biraz daha fazla zaman alacaktır (artı biraz daha fazla hataya eğilimli olurdu). Ayrıca bu yaklaşım, kullanıcının gördüklerine karşı test yapmanızı sağlar. Etkinleştirilmiş herhangi bir izin modülünüz varsa (bu, Drupal çekirdek izinlerinden yararlanır), tablo birleşimleri, Görünümler tarafından kullanılan sorguda gösterilir. Bu sorguyu aldıktan sonra, örneğin x rolü için kaç tane içerik türü düğüme izin verildiğini göstermek için ince ayar yapıyorum. Raporlamanın alabildiği kadar doğru ve hassas. Ve bunlar benim "gelişmiş" raporum.


2

Drupal ile bazı zamanlarda hata ayıklayıcı kullanmam gerekiyor (netbeans ile xdebug). Pek çok fonksiyona dolaylı olarak, sadece kodu okuyarak, bir geriye dönüş yazdırarak veya son çıktıyı kontrol ederek, dünya genelinde gerçekte neyin eklendiğini takip etmek neredeyse imkansız hale gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.