Come può un modulo rilevare quando viene emessa la pagina "Accesso negato"?


16

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:


13

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


Questa non è una buona soluzione per me poiché sta cambiando l'output, non solo rilevando il 403.
Fabien Quatravaux

12

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;

      // …

    }
    // …
  }
  // …   
}

Questo è un grande trucco ma funziona: quello che stai facendo si chiama dirottamento. È possibile collegare il proprio codice in un momento precedente e quindi riprodurre il codice principale con una modifica minima.
Fabien Quatravaux,

10

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.


Questa è davvero la buona risposta. Solo un punto da notare tuttavia: sembra funzionare solo se la pagina non è memorizzata nella cache. Se la pagina è già stata letta in precedenza, i drupal_get_http_header('Status')ritorni NULL.
Fabien Quatravaux,

4

Il tuo modulo potrebbe intercettare il valore di " Default 403 (access denied) page" che viene modificato dalla pagina " Administer > Site configuration > Error reporting":

  1. 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).

  2. modifica il modulo "Segnalazione errori" usando hook_form_FORM_ID_alterper leggere / scrivere nella variabile secondaria

  3. Se vuoi essere completamente invisibile per l'utente, il callback della tua pagina potrebbe essere chiamato drupal_goto( the_value_of_the_secondary_variable ).

  4. 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".



2

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']);

-2

È 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.