Як модуль може виявити, коли виводиться сторінка "заборонений доступ"?


16

Як можливо модулю виявити, коли Drupal видає сторінку "заборонений доступ"?
Я знаю, як це зробити з Drupal 6; Мені потрібно знати, як це зробити з Drupal 7.

Відповіді:


13

Ви можете встановити, які сторінки відображатимуться при помилках 403 та 404 (адміністратор / налаштування / повідомлення про помилки).

Я думаю, ви можете додати нову сторінку у свою hook_menu(), а потім встановити цю сторінку як зворотний виклик 403 помилок. Коли ви звертаєтесь до вашого зворотного дзвінка в користувальницьке меню, ви знаєте, що виводить сторінку "доступ заборонено"!


Це не гарне рішення для мене, оскільки це змінює вихід, не лише виявляючи 403.
Фаб'єн Кватраво

12

Я роблю це в Boost 7.x. Це не дуже, але це справді справляється.

function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {
  if ($callback == 'drupal_deliver_html_page') {
    $callback = 'boost_deliver_html_page';
  }
}

function boost_deliver_html_page($page_callback_result) {
  global $_boost;

  // Menu status constants are integers; page content is a string or array.
  if (is_int($page_callback_result)) {
    // @todo: Break these up into separate functions?
    switch ($page_callback_result) {

      // …

      case MENU_ACCESS_DENIED:
        // 403 page.
        $_boost['menu_item']['status'] = 403;
        break;

      // …

    }
    // …
  }
  // …   
}

Цей великий злом, але він працює: те, що ви робите, називається викраденням. Ви підключаєте власний код на більш ранній момент, а потім відтворюєте основний код з мінімальною модифікацією.
Фаб'єн Кватраво

10

У Drupal 7 функцією, яка повертає вже встановлені заголовки HTTP, є drupal_get_http_header () , яка вимагає ім'я заголовка HTTP як параметр. Дивлячись на authorize_access_denied_page () , і drupal_fast_404 () код ясно , які значення для передачі цієї функції.

  // authorize_access_denied_page()
  drupal_add_http_header('Status', '403 Forbidden');
  watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
  drupal_set_title('Access denied');
  return t('You are not allowed to access this page.');
// drupal_fast_404()
if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
  drupal_add_http_header('Status', '404 Not Found');
  $fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
  // Replace @path in the variable with the page path.
  print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
  exit;
}

Коли заголовок "Статус" починається з 403 , то Drupal виводить сторінку з забороненим доступом.

Переконайтеся, що дзвінок drupal_get_http_header('Status')відбувається пізно. Дзвінки під час hook_init()занадто рано, але при виклику під час hook_page_alter()(або будь-якого гачка попередньої обробки теми) буде оновлена ​​інформація заголовка.


Це справді хороша відповідь. Однак слід зазначити лише один момент: він, здається, працює лише в тому випадку, якщо сторінка не кешована. Якщо до сторінки вже було доступно, drupal_get_http_header('Status')повертається NULL.
Fabien Quatravaux

4

Ваш модуль може перехопити значення " Default 403 (access denied) page", яке змінюється сторінкою " Administer > Site configuration > Error reporting":

  1. В hook_enable, використовуючи variable_get/ variable_set, скопіювати наявне значення для вторинних змінних і замінити змінний за власним шляху (який ви зареєструвалися з допомогою hook_menu).

  2. змінити форму "Повідомлення про помилки" за допомогою hook_form_FORM_ID_alterчитання з / запису на вторинну змінну

  3. Якщо ви хочете бути повністю непомітними для користувача, зворотний дзвінок на сторінку може зателефонувати drupal_goto( the_value_of_the_secondary_variable ).

  4. В hook_disable, відновіть значення з вторинної змінної.


І це все, ваш модуль отримує сповіщення в чистому вигляді (і невидиме для користувача), коли спрацьовує "Заборонено доступ".


2

Невже ви могли використовувати get_headers()функцію PHP ?

http://php.net/manual/en/function.get-headers.php

Першим елементом у масиві, що повертається, буде код відповіді. Якщо він містить "403", то Drupal повернув сторінку "заборонений доступ".

Я не впевнений, де було б найкраще місце для дзвінка. Можливо hook_exit(), залежно від ваших потреб:

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6


2

Це найпростіший спосіб виявити заборонений доступ (403) та сторінку не знайдено (404) у Drupal 7.

// get the menu router item for the current page
$router_item = menu_get_item();

// if there is no router item, this page is not found
$is_page_not_found_404 = empty($router_item);

// if 'access' is empty for the router item, access is denied
$is_access_denied_403 = empty($router_item['access']);

-2

Для цього можна використовувати модуль Панелі .

Модуль Панелі дозволяє адміністратору сайту створювати спеціальні макети для багаторазового використання. По суті, це диспетчер вмісту, який дозволяє візуально спроектувати макет і розмістити вміст у межах цього макета. Інтеграція з іншими системами дозволяє створювати вузли, які використовують це, цільові сторінки, які використовують це, і навіть переосмислювати системні сторінки, такі як систематика та вузлова сторінка, щоб ви могли налаштувати макет свого сайту з дуже дрібними дозволами.

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