it-swarm-tr.com

Bir modül, "erişim reddedildi" sayfası çıktısı alındığında nasıl algılanabilir?

Bir modül için Drupal "erişim reddedildi" sayfası çıktısını ne zaman algılayabilir?
Drupal 6 ile nasıl yapılacağını biliyorum; Drupal 7 ile nasıl yapılacağını bilmem gerekiyor.

16
kiamlaluno

Drupal 7 içinde, önceden ayarlanmış HTTP üstbilgilerini döndüren işlev drupal_get_http_header () olup parametre olarak HTTP üstbilgisi adını gerektirir. authorize_access_denied_page) () ve drupal_fast_404 () kodu, bu işleve hangi değerlerin aktarılacağını netleştirir.

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

"Durum" üstbilgisi 403 ile başladığında, Drupal erişim reddedilen bir sayfa çıktılar.

drupal_get_http_header('Status') çağrısının geç gerçekleştiğinden emin olun. hook_init() sırasında çağrı yapmak çok erken, ancak hook_page_alter() (veya herhangi bir tema önişleme kancası) sırasında çağrıldığında güncellenmiş başlık bilgisi olacaktır.

10
kiamlaluno

403 ve 404 hataları oluştuğunda hangi sayfaların görüntüleneceğini ayarlayabilirsiniz (admin/settings/hata bildirimi).

Sanırım hook_menu() klasörünüze yeni bir sayfa ekleyebilir, ardından bu sayfayı 403 hatası geri araması olarak ayarlayabilirsiniz. Özel menü geri aramanıza ulaşıldığında, "erişim reddedildi" sayfasını çıktıladığınızı biliyorsunuz!

13
opi

Bunu Boost 7.x ile yapıyorum. Güzel değil, ama işi hallediyor.

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

Modülünüz, "Administer > Site configuration > Error reporting" Sayfası tarafından değiştirilen "Default 403 (access denied) page" değerini arayabilir:

  1. hook_enable İçinde, variable_get/variable_set, mevcut değeri kopyala ikincil bir değişkene ve değişkeni kendiniz değiştirin yol (hook_menu kullanarak kaydettirdiğiniz).

  2. ikincil değişkenten okuma/yazma için hook_form_FORM_ID_alter kullanarak "Hata bildirme" formunu değiştirin

  3. Kullanıcı için tamamen görünmez olmak istiyorsanız, sayfa geri aramanız drupal_goto( the_value_of_the_secondary_variable ) öğesini arayabilir.

  4. hook_disable 'Da, değeri geri yükle ikincil değişkenden.


Ve işte bu, modülünüz "Erişim reddedildi" tetiklendiğinde temiz bir şekilde (ve kullanıcı tarafından görülemez) bilgilendirilir.

4
wildpeaks

Şüphesiz PHP'nin get_headers() işlevini kullanabilirsiniz?

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

Döndürülen dizideki ilk öğe yanıt kodu olacaktır. '403' içeriyorsa Drupal bir "erişim reddedildi" sayfası döndürdü.

Onu aramak için en iyi yerin nerede olacağından emin değilim. Muhtemelen hook_exit(), ihtiyaçlarınıza bağlı olarak:

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

2
Greg

Drupal 7] 'de Erişim Reddedildi (403) ve Sayfa Bulunamadı (404) tespit etmenin en basit yoludur.

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