it-swarm.asia

كيف يمكنني تصحيح الأذونات؟

كيف يمكنني تصحيح الأذونات في 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
36
Refineo

إحدى الطرق التي يمكنك القيام بها هي إنشاء وحدة مخصصة ، معلومات الوصول للطباعة في كل صفحة ، كل عقدة ، كل كتلة.

تقوم دالة 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;
}

وهكذا ، في الأساس ، نفس المفهوم ، يمكنك أن تفعل الشيء نفسه للعقدة أو الشكل أو المشاهدات. أتمنى أن يساعدك هذا.

21
gilzero

تحرير الملف الرئيسي لوحدة المستخدم ؛ جد الدالة user_access() ، أضف سطرين قبل العبارة 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]);
7
temoto

يبدو أن لديك جميع الأدوات القائمة على واجهة المستخدم الرسومية بالفعل لاستكشاف الأخطاء وإصلاحها. خدعة أكثر تقدمًا (وربما أكثر صعوبة) استخدمتها بفعالية في الماضي هي:

  1. أنشئ عرضًا يتضمن الحقول والأدوار وأنواع العقدة وما إلى ذلك التي أريد اختبارها.
  2. قم بتمكين "عرض الاستعلام" في صفحة الخيارات المتقدمة في طرق العرض.
  3. قم بتنفيذ عرض ولصق استعلام SQL في محرر SQL المستند إلى واجهة المستخدم الرسومية مثل Navicat (تجاري) أو MySQL Workbench (مجانًا).
  4. شاهد ما لا تظهر العقد.
  5. تعديل الاستعلام لاحتياجاتك.

في كثير من الحالات ، فإن الاستعلامات التي تثيرها المشاهدات هي معقدة نوعًا ما (صدمة مليئة بالانضمامات) ولإنشاءها يدويًا سيستغرق مزيدًا من الوقت (بالإضافة إلى أنه سيكون أكثر عرضة للخطأ). كما يضمن هذا النهج أنك تختبر مقابل ما يراه المستخدم. إذا قمت بتمكين أي وحدات أذونات ممكّنة (تستفيد من Drupal الأساسية) ، فإن وصلات الجدول الخاصة بها ستظهر في الاستعلام الذي تستخدمه طرق العرض. بمجرد أن أحصل على هذا الاستعلام ، أقوم بتعديله لإظهار كيفية يُسمح بالعديد من العقد من نوع المحتوى x للدور x ، على سبيل المثال. إنها دقيقة ودقيقة كما يمكن أن تحصل عليها التقارير ، وهذه هي تقاريري "المتقدمة".

5
amateur barista

مع Drupal لا بد لي من استخدام مصحح أخطاء في بعض الأحيان (xdebug مع netbeans). تُسمى الكثير من الوظائف بشكل غير مباشر تقريبًا مما يجعل من المستحيل تقريبًا تتبع ما يتم إلحاقه عالميًا من خلال قراءة الرمز فقط أو طباعة backtrace أو فحص الناتج النهائي.

2
gagarine