W jaki sposób moduł może wykryć, kiedy wyświetlana jest strona „odmowa dostępu”?

16

W jaki sposób moduł może wykryć, kiedy Drupal wysyła stronę „odmowy dostępu”?
Wiem, jak to zrobić za pomocą Drupala 6; Muszę wiedzieć, jak to zrobić w Drupal 7.

kiamlaluno
źródło

Odpowiedzi:

13

Możesz ustawić, które strony będą wyświetlane, gdy wystąpią błędy 403 i 404 (administrator / ustawienia / raportowanie błędów).

Myślę, że możesz dodać nową stronę do swojej hook_menu(), a następnie ustawić tę stronę jako wywołanie zwrotne błędu 403. Po naciśnięciu niestandardowego menu zwrotnego menu wiesz, że wyświetlasz stronę „odmowa dostępu”!

opi
źródło
Nie jest to dla mnie dobre rozwiązanie, ponieważ zmienia to wyjście, nie tylko wykrywa 403.
Fabien Quatravaux 21.04.16
12

Robię to w Boost 7.x. To nie jest ładne, ale wykonuje zadanie.

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;

      // …

    }
    // …
  }
  // …   
}
mikeytown2
źródło
To jest duży hack, ale działa: to, co robisz, nazywa się porwaniem. Włóż własny kod wcześniej, a następnie odtwórz kod podstawowy z minimalną modyfikacją.
Fabien Quatravaux 21.04.16
10

W Drupal 7 funkcją zwracającą już ustawione nagłówki HTTP jest drupal_get_http_header () , która wymaga nazwy nagłówka HTTP jako parametru. Patrząc na authorize_access_denied_page () i drupal_fast_404 () kod jasno jakie wartości przekazać do tej funkcji.

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

Gdy nagłówek „Status” zaczyna się od 403 , wtedy Drupal wyświetla stronę odmowy dostępu.

Upewnij się, że wezwanie do drupal_get_http_header('Status')nastąpi późno. Wywołanie podczas hook_init()jest zbyt wcześnie, ale wywołanie go podczas hook_page_alter()(lub dowolnego haka wstępnego przetwarzania motywu) będzie zawierało zaktualizowane informacje nagłówka.

kiamlaluno
źródło
To naprawdę dobra odpowiedź. Należy jednak zwrócić uwagę na jeden punkt: wydaje się, że działa tylko wtedy, gdy strona nie jest buforowana. Jeśli strona była już dostępna wcześniej, następuje drupal_get_http_header('Status')zwrot NULL.
Fabien Quatravaux
4

Twój moduł może przechwycić wartość „ Default 403 (access denied) page”, która jest modyfikowana przez stronę „ Administer > Site configuration > Error reporting”:

  1. W hook_enable, używając variable_get/ variable_set, skopiuj istniejącą wartość do zmiennej wtórnej i zastąp zmienną własną ścieżką (którą zarejestrowałeś hook_menu).

  2. zmień formularz „Raportowanie błędów”, używając hook_form_FORM_ID_alterdo odczytu z / do zmiennej wtórnej

  3. Jeśli chcesz być całkowicie niewidoczny dla użytkownika, oddzwanianie do strony może zadzwonić drupal_goto( the_value_of_the_secondary_variable ).

  4. W hook_disable, przywrócić wartość ze zmiennej wtórnym.


I to wszystko, twój moduł jest powiadamiany w czysty sposób (i niewidoczny dla użytkownika), gdy zostanie wywołane „Odmowa dostępu”.

dzikie piki
źródło
2

Jest to najprostszy sposób na wykrycie odmowy dostępu (403) i nie znaleziono strony (404) w 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']);
Lindsay
źródło
-2

Możesz do tego użyć modułu Panele .

Moduł Panele pozwala administratorowi strony tworzyć niestandardowe układy do wielu zastosowań. Jego rdzeniem jest menedżer zawartości typu przeciągnij i upuść, który pozwala wizualnie zaprojektować układ i umieścić zawartość w tym układzie. Integracja z innymi systemami pozwala tworzyć węzły, które tego używają, strony docelowe, które tego używają, a nawet zastępują strony systemowe, takie jak taksonomia i strona węzłów, dzięki czemu można dostosować układ witryny z bardzo drobnymi uprawnieniami.

Umuthan Uyan
źródło