web-dev-qa-db-fra.com

Comment un module peut-il détecter la sortie de la page "Accès refusé"?

Comment est-il possible pour un module de détecter quand Drupal sort la page "accès refusé"?
Je sais comment le faire avec Drupal 6; j'ai besoin de savoir comment le faire avec Drupal 7.

16
kiamlaluno

Dans Drupal 7, la fonction qui renvoie les en-têtes HTTP déjà définis est drupal_get_http_header () , qui requiert le nom de l'en-tête HTTP comme paramètre. Regarder authorize_access_denied_page () et drupal_fast_404 () le code indique clairement les valeurs à passer à cette fonction.

  // 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;
}

Lorsque l'en-tête "Status" commence par 403 , alors Drupal affiche une page d'accès refusé).

Assurez-vous que l'appel à drupal_get_http_header('Status') arrive tard. Appeler pendant hook_init() est trop tôt, mais l'appeler pendant hook_page_alter() (ou tout crochet de prétraitement de thème) aura les informations d'en-tête mises à jour.

10
kiamlaluno

Vous pouvez définir les pages à afficher lorsque des erreurs 403 et 404 se produisent (admin/paramètres/rapport d'erreurs).

Je suppose que vous pouvez ajouter une nouvelle page dans votre hook_menu(), puis définir cette page comme rappel d'erreur 403. Lorsque votre rappel de menu personnalisé est atteint, vous savez que vous affichez la page "accès refusé"!

13
opi

Je le fais dans Boost 7.x. Ce n'est pas joli, mais cela fait le travail.

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

Votre module pourrait intercepter la valeur de "Default 403 (access denied) page" qui est modifiée par la page "Administer > Site configuration > Error reporting":

  1. Dans hook_enable, En utilisant variable_get/variable_set, copiez la valeur existante dans une variable secondaire et remplacez la variable par la vôtre chemin (que vous avez enregistré en utilisant hook_menu).

  2. modifiez le formulaire "Rapport d'erreur" en utilisant hook_form_FORM_ID_alter pour lire/écrire dans la variable secondaire

  3. Si vous voulez être complètement invisible pour l'utilisateur, le rappel de votre page pourrait appeler drupal_goto( the_value_of_the_secondary_variable ).

  4. Dans hook_disable, restaurez la valeur à partir de la variable secondaire.


Et c'est tout, votre module est notifié d'une manière propre (et invisible pour l'utilisateur) lorsque "Accès refusé" est déclenché.

4
wildpeaks

Vous pourriez sûrement utiliser la fonction get_headers() de PHP?

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

Le premier élément du tableau renvoyé sera le code de réponse. S'il contient '403' alors Drupal a retourné une page "accès refusé".

Je ne sais pas où serait le meilleur endroit pour l'appeler. Probablement hook_exit(), selon vos besoins:

http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6

2
Greg

C'est le moyen le plus simple de détecter l'accès refusé (403) et la page non trouvée (404) dans 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