Wie kann ein Modul erkennen, wann die Seite "Zugriff verweigert" ausgegeben wird?

16

Wie kann ein Modul erkennen, wenn Drupal die Seite "Zugriff verweigert" ausgibt?
Ich weiß, wie es mit Drupal 6 geht. Ich muss wissen, wie es mit Drupal 7 geht.

kiamlaluno
quelle

Antworten:

13

Sie können festlegen, welche Seiten angezeigt werden, wenn 403- und 404-Fehler auftreten (admin / settings / error-reporting).

Ich denke, Sie können eine neue Seite in Ihre hinzufügen hook_menu()und diese Seite dann als 403-Fehler-Rückruf festlegen. Wenn Sie Ihren benutzerdefinierten Menü-Rückruf erhalten, wissen Sie, dass Sie die Seite "Zugriff verweigert" ausgeben!

opi
quelle
Dies ist keine gute Lösung für mich, da dies die Ausgabe ändert und nicht nur die 403 erkennt.
Fabien Quatravaux
12

Ich mache das in Boost 7.x. Es ist nicht schön, aber es erledigt die Arbeit.

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;

      // …

    }
    // …
  }
  // …   
}
mikeytown2
quelle
Dies ist ein großer Hack, aber es funktioniert: Was Sie tun, nennt man Hijacking. Sie fügen Ihren eigenen Code zu einem früheren Zeitpunkt ein und reproduzieren dann den Kerncode mit einer minimalen Änderung.
Fabien Quatravaux
10

In Drupal 7 ist die Funktion, die die bereits gesetzten HTTP-Header zurückgibt , drupal_get_http_header () , für die der HTTP- Headername als Parameter erforderlich ist. Ein Blick auf authorize_access_denied_page () und drupal_fast_404 () verdeutlicht, welche Werte an diese Funktion übergeben werden sollen.

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

Wenn der "Status" -Header mit 403 beginnt , gibt Drupal eine Seite aus, deren Zugriff verweigert wurde.

Stellen Sie sicher, dass der Anruf zu drupal_get_http_header('Status')spät kommt. Das Aufrufen während hook_init()ist zu früh, aber das Aufrufen während hook_page_alter()(oder eines beliebigen Themavorverarbeitungs-Hooks) enthält die aktualisierten Header-Informationen.

kiamlaluno
quelle
Dieser ist wirklich die gute Antwort. Nur ein Punkt zu beachten: Es scheint nur zu funktionieren, wenn die Seite nicht zwischengespeichert ist. Wenn auf die Seite bereits zuvor zugegriffen wurde, wird die Seite drupal_get_http_header('Status')zurückgegeben NULL.
Fabien Quatravaux
4

Ihr Modul könnte den Wert von " Default 403 (access denied) page" abfangen, der von der Seite " Administer > Site configuration > Error reporting" geändert wird :

  1. In hook_enable, mit variable_get/ variable_set, kopieren Sie den vorhandenen Wert auf eine sekundäre Variable und die Variable durch eigene ersetzen Pfad (die Sie verwenden registriert hook_menu).

  2. Ändern Sie das Formular "Fehlerberichterstattung", indem Sie hook_form_FORM_ID_alterin die sekundäre Variable lesen / schreiben

  3. Wenn Sie für den Benutzer völlig unsichtbar sein möchten, könnte Ihre Seite einen Rückruf an rufen drupal_goto( the_value_of_the_secondary_variable ).

  4. In hook_disable, den Wert wiederherstellen von den sekundären Variablen.


Und das war's, Ihr Modul wird auf saubere Weise (und für den Benutzer unsichtbar) benachrichtigt, wenn "Zugriff verweigert" ausgelöst wird.

Wildpeaks
quelle
2

Dies ist die einfachste Methode zum Erkennen von Zugriff verweigert (403) und Seite nicht gefunden (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']);
Lindsay
quelle
-2

Hierfür können Sie das Modul Panels verwenden .

Mit dem Modul Panels kann ein Site-Administrator benutzerdefinierte Layouts für mehrere Zwecke erstellen. Im Kern handelt es sich um einen Drag-and-Drop-Inhaltsmanager, mit dem Sie ein Layout visuell gestalten und Inhalte in diesem Layout platzieren können. Durch die Integration in andere Systeme können Sie Knoten erstellen, die dies verwenden, Zielseiten, die dies verwenden, und sogar Systemseiten wie Taxonomie und Knotenseite überschreiben, sodass Sie das Layout Ihrer Site mit sehr detaillierten Berechtigungen anpassen können.

Umuthan Uyan
quelle