Как я отлаживаю полномочия?

Как я отлаживаю полномочия в 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
06.06.2017, 10:27
3 ответа

Одним путем можно сделать, делают пользовательский модуль, печатают информацию о доступе на каждой странице, каждом узле, каждом блоке.

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
24.01.2020, 22:40
  • 1
    Когда аргументы доступа в yourmodule_get_page_access() не имейте никакого смысла, можно смотреть на $router_item['access_callback'] и затем ищите функцию с тем именем в соответствующих модулях для изучения то, что продолжается там. Большой ответ. огромное спасибо –  Wtower 26.06.2014, 11:40

С Drupal я должен использовать отладчик несколько раз (xdebug с netbeans). Партию функций называют, косвенно делая почти невозможным следовать за тем, что действительно добавляет глобально, только читая код, печатая след или проверяя окончательный результат.

2
24.01.2020, 22:40

Это похоже как, у Вас есть все основанные на GUI инструменты уже для поиска и устранения неисправностей полномочий. Еще одно усовершенствованное (и вероятно более трудный) обманывает, я использовал эффективно в прошлом:

  1. Создайте Представление с полями, ролями, типами узлов, и т.д. что я хочу протестировать на.
  2. Включите "запрос дисплея" на странице расширенных настроек Представлений.
  3. Выполните Представление и вставьте SQL-запрос в основанного на GUI редактора SQL, такого как (коммерческий) Navicat или (свободный) MySQL Workbench.
  4. Посмотрите то, что не разоблачают узлы.
  5. Настройте запрос к своим потребностям.

Я много случаев, запросы, которые выложенные Представления довольно сложны (шок, полный соединений) и создать их вручную, заняли бы немного больше времени (плюс он будет подвержено ошибкам). Также этот подход гарантирует, что Вы тестируете, против какого видит пользователь. Если у Вас будут какие-либо включенные модули полномочий (которые используют полномочия ядра Drupal), то их соединения таблицы обнаружатся в запросе, используемом Представлениями. После того как я получил этот запрос, который я настраиваю его для показа, сколько узлов типа контента x позволяется для роли x, например. Это является столь точным и мелкомодульным, как создание отчетов может добраться. И это - мои "усовершенствованные" отчеты.

5
24.01.2020, 22:40

Теги

Похожие вопросы