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

16

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

kiamlaluno
fuente

Respuestas:

13

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 configurar 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"!

opi
fuente
Esta no es una buena solución para mí, ya que está cambiando la salida, no solo detectando el 403.
Fabien Quatravaux
12

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;

      // …

    }
    // …
  }
  // …   
}
mikeytown2
fuente
Este es un gran truco, pero funciona: lo que estás haciendo se llama secuestro. Conecta su propio código en un punto anterior y luego reproduce el código central con una modificación mínima.
Fabien Quatravaux
10

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. Al mirar authorize_access_denied_page () , y el código drupal_fast_404 () 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 , Drupal genera una página de acceso denegado.

Asegúrate de que la llamada 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.

kiamlaluno
fuente
Esta es realmente la buena respuesta. Sin embargo, solo un punto a tener en cuenta: parece funcionar solo si la página no está en caché. Si ya se ha accedido a la página anteriormente, las drupal_get_http_header('Status')devoluciones NULL.
Fabien Quatravaux
4

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

  1. En hook_enable, usando variable_get/ variable_set, copie el valor existente en una variable secundaria y reemplace la variable por su propia ruta (que registró usando hook_menu).

  2. alterar el formulario "Informe de errores" usando hook_form_FORM_ID_alterpara 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 drupal_goto( the_value_of_the_secondary_variable ).

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


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

picos salvajes
fuente
2

Esta es la forma más sencilla de detectar Acceso denegado (403) y 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']);
Lindsay
fuente
-2

Puede usar el módulo Paneles para esto.

El módulo Paneles permite al administrador del sitio crear diseños personalizados para múltiples usos. En esencia, es un administrador de contenido de arrastrar y soltar que le permite diseñar visualmente un diseño y colocar contenido dentro de ese diseño. La integración con otros sistemas le permite crear nodos que usan esto, páginas de destino que lo usan e incluso anular páginas del sistema como la taxonomía y la página de nodos para que pueda personalizar el diseño de su sitio con permisos muy precisos.

Umuthan Uyan
fuente