Як мені налагоджувати дозволи?


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

Це може бути важливою частиною вашого запитання: Чи використовуєте ви будь-які вкладки чи власні модулі доступу до вузлів, наприклад node_access ?
любительська бариста

Примітка для самоврядування: node_access недоступний у D7, лише D6. Але можуть бути задіяні й інші модулі дозволів.
аматорська бариста

@amateurbarista так, я використовую модулі дозволів, як я вже згадував у PS2.
Refineo

Модуль filter_perms - еквівалент Drupal-7 згаданого вище модуля permissions_report
Druvision

Відповіді:


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

Потім ви можете підключити сторінку_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;
}

І так далі, в основному одне і те ж поняття, ви можете зробити те ж саме для вузла, форми, перегляду. Сподіваюся, це допомагає.


Коли аргументи доступу yourmodule_get_page_access()не мають сенсу, ви можете подивитися $router_item['access_callback']і потім шукати функцію з цим іменем у відповідних модулях, щоб вивчити, що там відбувається. Чудова відповідь.
Wtower

7

Редагувати головний файл модуля користувача; знайти user_access()функцію, додати 2 рядки перед 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]);

Це насправді досить добре. Як щодо дозволів у галузі налагодження?
Michal Przybylowicz

Я бачу значення в барабані, але drush не знає, хто це користувач. Але це не відображається на сторінці, визначеній у гачку_меню. Не знаєте, чому ні.
sam452

error_logне виводиться на екран. Для моєї установки він записав у журнал помилок apache. php.net/manual/en/function.error-log.php
Райре

5

Схоже, у вас є всі інструменти на основі GUI вже для усунення дозволів. Ще один вдосконалений (і, мабуть, складніший) трюк, який я ефективно використовував у минулому, це:

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

У багатьох випадках запити, які виказують Views, досить складні (шок повний приєднань), і побудувати їх вручну зайняло б трохи більше часу (плюс було б трохи більше схильних до помилок). Також такий підхід забезпечує тестування на те, що бачить користувач. Якщо у вас включені будь-які модулі дозволів (в яких використовуються основні дозволи Drupal), їх приєднання до таблиці відображатимуться в запиті, який використовується Views. Після отримання цього запиту я налаштовую його, щоб показати, скільки вузлів вмісту типу x дозволено, наприклад, для ролі x. Це настільки точно і тонко, як звітність може отримати. І це мої "просунуті" звіти.


2

З Drupal мені доводиться використовувати налагоджувач кілька разів (xdebug з netbeans). Багато функцій називаються опосередковано, що робить практично неможливим прослідкувати те, що дійсно додається в усьому світі, лише читаючи код, друкуючи backtrace або перевіряючи кінцевий результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.