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.
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.
Antworten:
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!
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;
// …
}
// …
}
// …
}
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.
drupal_get_http_header('Status')
zurückgegeben NULL
.
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 :
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
).
Ändern Sie das Formular "Fehlerberichterstattung", indem Sie hook_form_FORM_ID_alter
in die sekundäre Variable lesen / schreiben
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 )
.
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.
Sicherlich könnten Sie die PHP- get_headers()
Funktion verwenden?
Das erste zurückgegebene Element im Array ist der Antwortcode. Wenn es '403' enthält, hat Drupal eine Seite "Zugriff verweigert" zurückgegeben.
Ich bin mir nicht sicher, wo ich am besten anrufen kann. Wahrscheinlich hook_exit()
, je nach Ihren Bedürfnissen:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
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']);
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.