it-swarm-es.com

¿Cómo puede un módulo detectar cuándo se genera la página "acceso denegado"?

¿Cómo es posible que un módulo detecte cuando Drupal está generando la página "acceso denegado"?
Sé cómo hacerlo con Drupal 6; Necesito saber cómo hacerlo con Drupal 7.

16
kiamlaluno

En Drupal 7, la función que devuelve los encabezados HTTP ya establecidos es drupal_get_http_header () , que requiere el nombre del encabezado HTTP como parámetro. Mirando authorize_access_denied_page () , y drupal_fast_404 () el código deja en claro qué valores pasar a esa función.

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

Cuando el encabezado "Estado" comienza con 403 , entonces Drupal muestra una página de acceso denegado).

Asegúrese de que la llamada a drupal_get_http_header('Status') llegue tarde. Llamar durante hook_init() es demasiado pronto, pero llamarlo durante hook_page_alter() (o cualquier enlace de preproceso de tema) tendrá la información de encabezado actualizada.

10
kiamlaluno

Puede establecer qué páginas se muestran cuando se producen errores 403 y 404 (admin/settings/error-reporting).

Supongo que puede agregar una nueva página en su hook_menu(), luego configure esta página como la devolución de llamada de error 403. Cuando se golpea la devolución de llamada de su menú personalizado, ¡sabe que está generando la página "acceso denegado"!

13
opi

Hago esto en Boost 7.x. No es bonito, pero hace el trabajo.

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

Su módulo podría interceptar el valor de "Default 403 (access denied) page", que se modifica mediante la página "Administer > Site configuration > Error reporting":

  1. En hook_enable, Usando variable_get/variable_set, copie el valor existente a una variable secundaria y reemplace la variable por la suya ruta (que registraste usando hook_menu).

  2. modifique el formulario "Informe de errores" usando hook_form_FORM_ID_alter para leer/escribir en la variable secundaria

  3. Si desea ser completamente invisible para el usuario, la devolución de llamada de su página podría llamar a drupal_goto( the_value_of_the_secondary_variable ).

  4. En hook_disable, restaurar el valor de la variable secundaria.


Y eso es todo, su módulo recibe una notificación de manera limpia (e invisible para el usuario) cuando se activa "Acceso denegado".

4
wildpeaks

¿Seguramente podrías usar la función get_headers() de PHP?

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

El primer elemento de la matriz devuelto será el código de respuesta. Si contiene '403', entonces Drupal devolvió una página de "acceso denegado".

No estoy seguro de dónde sería el mejor lugar para llamarlo. Probablemente hook_exit(), dependiendo de sus necesidades:

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

2
Greg

Esta es la forma más sencilla de detectar el acceso denegado (403) y la página no encontrada (404) en 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