it-swarm-eu.dev

Jak může modul detekovat, když je na stránce "Přístup odepřen"?

Jak je možné, aby modul zjistil, kdy Drupal vydává stránku "přístup odepřen"?
Vím, jak to udělat s Drupal 6; Potřebuji vědět, jak to udělat s Drupal 7).

16
kiamlaluno

V Drupal 7) je funkce, která vrací již nastavené záhlaví HTTP drupal_get_http_header () , což vyžaduje název hlavičky HTTP jako parametr. Při pohledu na authorize_access_denied_page () a drupal_fast_404 () kód objasňuje, které hodnoty předat této funkci.

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

Když záhlaví „Status“ začíná 403 , pak Drupal výstup na stránku odepřenou přístupem).

Ujistěte se, že volání funkce drupal_get_http_header('Status') probíhá pozdě. Volání během hook_init() je příliš brzy, ale jeho volání během hook_page_alter() (nebo jakéhokoli zavěšení motivu) bude mít aktualizované informace o záhlaví.

10
kiamlaluno

Můžete nastavit, které stránky se zobrazí, když dojde k chybám 403 a 404 (administrátor/nastavení/hlášení chyb).

Myslím, že do své funkce hook_menu() můžete přidat novou stránku a tuto stránku nastavit jako zpětné volání 403. Když je zasláno vaše vlastní zpětné volání nabídky, víte, že vydáváte stránku „Přístup byl odepřen“!

13
opi

Dělám to v Boost 7.x. Není to hezké, ale dělá práci.

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;

      // …

    }
    // …
  }
  // …   
}
12
mikeytown2

Váš modul by mohl zachytit hodnotu "Default 403 (access denied) page", která je upravena na stránce "Administer > Site configuration > Error reporting":

  1. V hook_enable Pomocí variable_get/variable_set, zkopírujte existující hodnot do sekundární proměnné a nahraďte proměnnou svou vlastní cesta (kterou jste zaregistrovali pomocí hook_menu).

  2. změňte formulář „Hlášení chyb“ pomocí hook_form_FORM_ID_alter pro čtení/zápis do sekundární proměnné

  3. Pokud chcete být pro uživatele zcela neviditelní, může zpětné volání vaší stránky volat drupal_goto( the_value_of_the_secondary_variable ).

  4. V hook_disableobnovte hodnot ze sekundární proměnné.


A to je vše, váš modul dostane upozornění čistým způsobem (a pro uživatele neviditelný), když je spuštěn "Přístup odepřen".

4
wildpeaks

Určitě byste mohli použít funkci PHP get_headers()?

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

Prvním prvkem vráceného pole bude kód odezvy. Pokud obsahuje '403', pak Drupal vrátil stránku „Přístup byl odepřen“).

Nejsem si jistý, kde by to bylo nejlepší místo, kde by se to dalo nazvat. Pravděpodobně hook_exit(), v závislosti na vašich potřebách:

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

2
Greg

Toto je nejjednodušší způsob, jak detekovat přístup odepřený (403) a stránka nenalezena (404) v 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
Lindsay