Как отлаживать разрешения?

Как отлаживать разрешения в Drupal 7?

Я использую основную отчетность, журналы ошибок, журналы ошибок модуля devel, блок разрешения доступа backtrace и узла, но иногда этого недостаточно. Что еще я должен проверить, чтобы узнать, почему определенные поля, представления или блоки не отображаются пользователю?

Я также обнаружил, что существует модуль для Drupal 6 для сообщения о разрешенных вызовах, но это не доступно для Drupal 7.

Я использую различные сторонние модули, связанные с разрешением:

- доступ к расширению узла 7.x-1.x-dev
 - быстрое администрирование разрешений 7.x-2.0
 - контроль доступа к органическим группам 7.x-1.x
 - доступ к группе profile2 7.x-1.x-dev
 - доступ к ur-узлу 7.x-1.x-dev
35 голосов | спросил Refineo 11 SunEurope/Moscow2011-12-11T23:44:09+04:00Europe/Moscow12bEurope/MoscowSun, 11 Dec 2011 23:44:09 +0400 2011, 23:44:09

4 ответа


20

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

Функция

menu_get_item () возвращает элемент маршрутизатора, у которого есть свойство access_arguments для текущей страницы.

/**
 * Показывать разрешение доступа к текущей странице.
 * /
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 ('Эта страница нуждается в том, чтобы у пользователя было разрешение% s на доступ к', array (
        '% p' ​​=> implode (',', $ arguments),
      ));
      $ output. = '</p>';
    }
    else {
      $ output = '<p>' , t («Эта страница не требует прав пользователя»). '</p>';
    }
    return $ output;
  }
}

Затем вы можете hook_page_alter, чтобы отображать информацию о доступе поверх каждой страницы.

/**
 * Реализует hook_page_alter ().
 *
 * Отображать информацию о доступе сверху каждой страницы.
 * /
function yourmodule_page_alter (& $ page) {

  //Создаем новую область в верхней части страницы для отображения информации о доступе.
  $ page ['content'] ['theverytop'] ['# markup'] = yourmodule_get_page_access ();
  $ page ['content'] ['theverytop'] ['# weight'] = -10;
  $ page ['content'] ['# sorted'] = FALSE;
}

Затем вы можете отобразить информацию о разрешении блока следующим образом:

/**
 * Реализация hook_block_alter
 *
 * Чтобы отобразить информацию разрешения блока на заголовок блока.
 * /

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 = 'Этот блок не имеет ограничений по разрешению ролей.';
  } else {
      $ output = 'Этот блок доступен для просмотра для роли пользователей:';
      foreach ($ rid as $ role_id) {
          $ rolename = db_query ("SELECT name from {role}, где rid =: rid", array (': rid' => $ role_id)) -> fetchField ();
          $ output. = $ rolename. '';
      }
  }

  //добавьте информацию о разрешении для блокировки заголовка для каждого блока
  $ block-> title. = $ output;
}

И так далее, в основном одна и та же концепция, вы можете сделать то же самое с узлом, формой, представлениями. Надеюсь это поможет.

ответил gilzero 14 WedEurope/Moscow2011-12-14T08:24:23+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 08:24:23 +0400 2011, 08:24:23
7

Отредактируйте основной файл модуля пользователя; найдите функцию user_access (), добавьте 2 строки перед оператором return и просмотрите журнал ошибок PHP.

$ given = isset ($ perm [$ account-> uid] [$ string]);
error_log (sprintf ('--- user_access:% s "% s" =% s', $ account-> имя, $ string, $ given? 'yes': 'no'));
return isset ($ perm [$ account-> uid] [$ string]);
ответил temoto 19 +04002013-10-19T20:25:39+04:00312013bEurope/MoscowSat, 19 Oct 2013 20:25:39 +0400 2013, 20:25:39
5

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

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

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

ответил amateur barista 14 WedEurope/Moscow2011-12-14T01:18:00+04:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2011 01:18:00 +0400 2011, 01:18:00
2

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

ответил gagarine 15 ThuEurope/Moscow2011-12-15T17:19:03+04:00Europe/Moscow12bEurope/MoscowThu, 15 Dec 2011 17:19:03 +0400 2011, 17:19:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132