Bir modül “erişim reddedildi” sayfasının çıktısı nasıl algılanır?


16

Bir modülün Drupal'ın "erişim engellendi" sayfasını çıkardığını algılaması nasıl mümkün olur?
Drupal 6 ile nasıl yapılacağını biliyorum; Drupal 7 ile nasıl yapılacağını bilmem gerekiyor.

Yanıtlar:


13

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

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


Bu benim için iyi bir çözüm değil, çünkü bu çıktıyı değiştiriyor, sadece
403'ü

12

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;

      // …

    }
    // …
  }
  // …   
}

Bu büyük bir hack ama işe yarıyor: Yaptığın şey kaçırma deniyor. Kendi kodunuzu daha erken bir noktaya takın ve çekirdek kodunu en az bir değişiklikle yeniden oluşturun.
Fabien Quatravaux

10

Drupal 7'de, önceden ayarlanmış HTTP üstbilgilerini döndüren işlev parametre olarak HTTP üstbilgisi adını gerektiren drupal_get_http_header () işlevidir . Bakıldığında authorize_access_denied_page () , ve drupal_fast_404 () kodu bu işlev için geçmesi için hangi değerleri açık hale getirir.

  // 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" başlığı 403 ile başladığında , Drupal bir erişim reddedildi sayfası çıkarır.

Çağrının drupal_get_http_header('Status')geç olduğundan emin olun . Sırasında çağrı hook_init()yapmak çok erken, ancak sırasında hook_page_alter()(veya herhangi bir tema önişleme çağrısı) çağrıldığında üstbilgi bilgileri güncellenir.


Bu gerçekten iyi bir cevap. Ancak dikkat edilmesi gereken bir nokta var: yalnızca sayfa önbelleğe alınmamışsa işe yarar. Sayfaya daha önce erişilmişse, drupal_get_http_header('Status')iadeler NULL.
Fabien Quatravaux

4

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

  1. In hook_enablekullanarak variable_get/ variable_set, mevcut değer kopyalayın ikincil değişkene ve kendi tarafından değişkeni değiştirmek (kullanmakta kayıtlı hangi yolu hook_menu).

  2. hook_form_FORM_ID_alterikincil değişkenden okuma / yazma işlevini kullanarak "Hata raporlama" formunu değiştirme

  3. Kullanıcı için tamamen görünmez olmak istiyorsanız, sayfanızın geri aramasını arayabilirsiniz drupal_goto( the_value_of_the_secondary_variable ).

  4. İçinde hook_disable, değeri ikincil değişkenten geri yükleyin .


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



2

Bu, Drupal 7'deki 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

Bunun için Paneller modülünü kullanabilirsiniz .

Paneller modülü, site yöneticisinin birden çok kullanım için özelleştirilmiş düzenler oluşturmasına olanak tanır. Özünde görsel olarak bir düzen tasarlamanızı ve bu düzen içine içerik yerleştirmenizi sağlayan bir sürükle ve bırak içerik yöneticisidir. Diğer sistemlerle entegrasyon, bunu kullanan düğümler oluşturmanıza, bunu kullanan sayfaları açmanıza ve hatta sınıflandırma ve düğüm sayfası gibi sistem sayfalarını geçersiz kılmanıza olanak tanır, böylece sitenizin düzenini çok ince taneli izinlerle özelleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.