it-swarm.it

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

Come è possibile che un modulo rilevi quando Drupal sta emettendo la pagina "accesso negato"?
So come farlo con Drupal 6; Ho bisogno di sapere come farlo con Drupal 7.

16
kiamlaluno

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 codice drupal_fast_404 () 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 , allora Drupal genera una pagina di accesso negato.

Assicurati che la chiamata a drupal_get_http_header('Status') abbia luogo in ritardo. Chiamare durante hook_init() è troppo presto, ma chiamandolo durante hook_page_alter() (o qualsiasi hook di preelaborazione del tema) le informazioni di intestazione saranno aggiornate.

10
kiamlaluno

È possibile impostare quali pagine visualizzare quando si verificano errori 403 e 404 (admin/settings/segnalazione errori).

Suppongo che tu possa aggiungere una nuova pagina nel tuo hook_menu(), quindi impostare questa pagina come callback dell'errore 403. Quando viene richiamato il callback del menu personalizzato, sai che stai emettendo la pagina "Accesso negato"!

13
opi

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;

      // …

    }
    // …
  }
  // …   
}
12
mikeytown2

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, Utilizzando variable_get/variable_set, copia il valore esistente in una variabile secondaria e sostituisci la variabile con la tua percorso (che hai registrato utilizzando hook_menu).

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

  3. Se vuoi essere completamente invisibile per l'utente, il callback della tua pagina potrebbe chiamare 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 pulito (e invisibile all'utente) quando viene attivato "Accesso negato".

4
wildpeaks

Sicuramente potresti usare la funzione get_headers() di PHP?

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

Il primo elemento dell'array restituito sarà il codice di risposta. Se contiene "403", allora 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

2
Greg

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
Lindsay