मैं अनुमतियां कैसे डिबग करूं?


36

मैं Drupal 7 में अनुमतियों को कैसे डिबग करूं?

मैं कोर रिपोर्टिंग, त्रुटि लॉग, डेवेल मॉड्यूल त्रुटि लॉग, बैकट्रेस और नोड एक्सेस अनुमति ब्लॉक का उपयोग करता हूं लेकिन कभी-कभी यह पर्याप्त नहीं होता है। मुझे यह पता लगाने के लिए और क्या देखना चाहिए कि कुछ फ़ील्ड, दृश्य या ब्लॉक उपयोगकर्ता को क्यों नहीं दिखा रहे हैं?

मैंने यह भी पाया कि 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

यह आपके प्रश्न का एक महत्वपूर्ण हिस्सा हो सकता है: क्या आप किसी भी कंट्रीब या कस्टम नोड एक्सेस मॉड्यूल का उपयोग कर रहे हैं, जैसे कि नोड_एक्सेस ?
शौकिया बरिस्ता

स्वयं पर ध्यान दें: नोड_एसीस डी 7 में उपलब्ध नहीं है, सिर्फ डी 6। लेकिन इसमें अन्य अनुमति मॉड्यूल शामिल हो सकते हैं।
शौकिया बरिस्ता

@amateurbarista हाँ, मैं अनुमति मॉड्यूल का उपयोग कर रहा हूँ जैसा कि मैंने PS2 में उल्लेख किया है।
रिफाइनो

Filter_perms मॉड्यूल एक Drupal-7 है जो अनुमतियों के समान
है_report

जवाबों:


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

फिर आप प्रत्येक पृष्ठ के शीर्ष पर पहुँच जानकारी प्रदर्शित करने के लिए हुक_पेज_ल्टर कर सकते हैं।

/**
 * 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']और फिर संबंधित मॉड्यूल में उस नाम के साथ फ़ंक्शन की तलाश कर सकते हैं ताकि वहां क्या हो रहा है। बहुत बढ़िया जवाब।
वेटॉवर

7

उपयोगकर्ता मॉड्यूल मुख्य फ़ाइल संपादित करें; user_access()फ़ंक्शन ढूंढें , returnस्टेटमेंट से पहले 2 लाइनें जोड़ें , और 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]);

यह वास्तव में बहुत अच्छा है। डीबग फ़ील्ड अनुमतियों के बारे में कैसे?
मिशैल प्रिज्बाईलोविज़ 16

मैं ड्रश में मूल्यों को देखता हूं, लेकिन ड्रश यह नहीं जानता कि उपयोगकर्ता कौन है। लेकिन यह हुक_मेनू में परिभाषित पृष्ठ पर दिखाई नहीं दे रहा है। अनिश्चित क्यों नहीं
1945 में sam452

error_logस्क्रीन के लिए उत्पादन नहीं करता है। मेरी स्थापना के लिए, इसने अपाचे त्रुटि लॉग को लिखा। php.net/manual/en/function.error-log.php
Ryre

5

ऐसा लगता है कि आपको सभी GUI- आधारित टूल पहले से ही अनुमतियों के निवारण के लिए मिल गए हैं। एक और उन्नत (और शायद अधिक कठिन) चाल मैंने अतीत में प्रभावी ढंग से उपयोग की है:

  1. खेतों, भूमिकाओं, नोड-प्रकार, आदि के साथ एक दृश्य का निर्माण करें, जिसे मैं परीक्षण करना चाहता हूं।
  2. दृश्य उन्नत विकल्प पृष्ठ पर "प्रदर्शन क्वेरी" सक्षम करें।
  3. दृश्य को निष्पादित करें और GUI- आधारित SQL संपादक जैसे कि Navicat (वाणिज्यिक) या MySQL कार्यक्षेत्र (मुक्त) में SQL क्वेरी पेस्ट करें।
  4. देखें कि क्या नोड्स दिखाई नहीं देते हैं।
  5. अपनी आवश्यकताओं के लिए क्वेरी को घुमाएँ।

मैं कई मामलों में जो दृश्य थूक देता हूं, वे जटिल होते हैं (जोड़ों से भरा झटका) और मैन्युअल रूप से उन्हें बनाने में थोड़ा अधिक समय लगेगा (साथ ही यह थोड़ा अधिक त्रुटि-प्रवण होगा)। इसके अलावा यह दृष्टिकोण सुनिश्चित करता है कि आप उपयोगकर्ता जो देख रहे हैं उसके खिलाफ परीक्षण कर रहे हैं। यदि आपके पास कोई भी अनुमति मॉड्यूल सक्षम है (जो कि ड्रुपल कोर अनुमतियों का उपयोग करता है), तो उनकी तालिका जोड़ दृश्य द्वारा उपयोग की जाने वाली क्वेरी में दिखाई देगी। एक बार जब मुझे यह क्वेरी मिल गई, तो मैंने यह दिखाने के लिए इसे ट्विस्ट किया कि रोल एक्स के लिए कंटेंट टाइप x के कितने नोड्स की अनुमति है, उदाहरण के लिए। यह उतना ही सटीक और बारीक है जितना रिपोर्टिंग मिल सकता है। और वे मेरी "उन्नत" रिपोर्ट हैं।


2

Drupal के साथ मुझे कुछ बार डिबगर का उपयोग करना पड़ता है (netbeans के साथ xdebug)। लॉट ऑफ़ फ़ंक्शंस को अप्रत्यक्ष रूप से लगभग असंभव बना दिया जाता है जिसका पालन करना वास्तव में विश्व स्तर पर केवल कोड को पढ़ने, एक बैकट्रेस को प्रिंट करने या अंतिम आउटपुट की जांच करने में सक्षम होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.