¿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.
¿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.
Respuestas:
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"!
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;
// …
}
// …
}
// …
}
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.
drupal_get_http_header('Status')
devoluciones NULL
.
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
":
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
).
alterar el formulario "Informe de errores" usando hook_form_FORM_ID_alter
para leer / escribir en la variable secundaria
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 )
.
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".
¿Seguramente podrías usar la get_headers()
función de PHP ?
El primer elemento en la matriz devuelta será el código de respuesta. Si contiene '403', 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
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']);
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.