Come è possibile che un modulo rilevi quando Drupal sta emettendo la pagina "Accesso negato"?
So come farlo con Drupal 6; Devo sapere come farlo con Drupal 7.
Come è possibile che un modulo rilevi quando Drupal sta emettendo la pagina "Accesso negato"?
So come farlo con Drupal 6; Devo sapere come farlo con Drupal 7.
Risposte:
È possibile impostare le pagine da visualizzare quando si verificano errori 403 e 404 (admin / settings / segnalazione errori).
Suppongo che tu possa aggiungere una nuova pagina nella tua hook_menu()
, quindi impostare questa pagina come callback dell'errore 403. Quando viene richiamato il callback del menu personalizzato, sai che stai inviando la pagina "Accesso negato"!
Faccio questo in Boost 7.x. Non è carino, ma fa il lavoro.
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;
// …
}
// …
}
// …
}
In Drupal 7, la funzione che restituisce le intestazioni HTTP già impostate è drupal_get_http_header () , che richiede il nome dell'intestazione HTTP come parametro. Guardando authorize_access_denied_page () e il codice drupal_fast_404 () si chiarisce quali valori passare a quella funzione.
// 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;
}
Quando l'intestazione "Status" inizia con 403 , Drupal emette una pagina di accesso negato.
Assicurati che la chiamata drupal_get_http_header('Status')
avvenga in ritardo. Chiamare durante hook_init()
è troppo presto, ma chiamandolo durante hook_page_alter()
(o qualsiasi hook di preelaborazione del tema) si avranno le informazioni di intestazione aggiornate.
drupal_get_http_header('Status')
ritorni NULL
.
Il tuo modulo potrebbe intercettare il valore di " Default 403 (access denied) page
" che viene modificato dalla pagina " Administer > Site configuration > Error reporting
":
In hook_enable
, usando variable_get
/ variable_set
, copia il valore esistente in una variabile secondaria e sostituisci la variabile con il tuo percorso (che hai registrato usando hook_menu
).
modifica il modulo "Segnalazione errori" usando hook_form_FORM_ID_alter
per leggere / scrivere nella variabile secondaria
Se vuoi essere completamente invisibile per l'utente, il callback della tua pagina potrebbe essere chiamato drupal_goto( the_value_of_the_secondary_variable )
.
In hook_disable
, ripristina il valore dalla variabile secondaria.
Ed è tutto, il tuo modulo viene avvisato in modo chiaro (e invisibile all'utente) quando viene attivato "Accesso negato".
Sicuramente potresti usare la get_headers()
funzione di PHP ?
Il primo elemento dell'array restituito sarà il codice di risposta. Se contiene "403", Drupal ha restituito una pagina "Accesso negato".
Non sono sicuro di dove sia il posto migliore per chiamarlo. Probabilmente hook_exit()
, a seconda delle tue esigenze:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
Questo è il modo più semplice per rilevare Accesso negato (403) e Pagina non trovata (404) in 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']);
È possibile utilizzare il modulo Pannelli per questo.
Il modulo Pannelli consente a un amministratore del sito di creare layout personalizzati per molteplici usi. Fondamentalmente è un gestore di contenuti drag and drop che ti consente di progettare visivamente un layout e posizionare i contenuti all'interno di quel layout. L'integrazione con altri sistemi ti consente di creare nodi che lo utilizzano, pagine di destinazione che lo utilizzano e persino di ignorare pagine di sistema come la tassonomia e la pagina del nodo in modo da poter personalizzare il layout del tuo sito con autorizzazioni molto precise.