it-swarm-id.com

Bagaimana modul mendeteksi ketika halaman "akses ditolak" adalah output?

Bagaimana mungkin modul dapat mendeteksi kapan Drupal mengeluarkan halaman "akses ditolak"?
Saya tahu bagaimana melakukannya dengan Drupal 6; Saya perlu tahu bagaimana melakukannya dengan Drupal 7.

16
kiamlaluno

Dalam Drupal 7, fungsi yang mengembalikan header HTTP yang telah ditetapkan adalah drupal_get_http_header () , yang memerlukan nama header HTTP sebagai parameter. Melihat otorize_access_denied_page) () , dan drupal_fast_404 () kode memperjelas nilai mana yang dilewatkan ke fungsi itu.

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

Ketika tajuk "Status" dimulai dengan 403 , kemudian Drupal menampilkan halaman yang ditolak aksesnya.

Pastikan panggilan ke drupal_get_http_header('Status') terjadi terlambat. Memanggil selama hook_init() terlalu cepat, tetapi memanggilnya selama hook_page_alter() (atau kait preprocess tema apa pun) akan memiliki informasi header yang diperbarui.

10
kiamlaluno

Anda dapat mengatur halaman mana yang ditampilkan ketika 403 & 404 kesalahan terjadi (admin/pengaturan/pelaporan kesalahan).

Saya kira Anda dapat menambahkan halaman baru di hook_menu() Anda, lalu mengatur halaman ini sebagai callback kesalahan 403. Saat panggilan balik menu khusus Anda diklik, Anda tahu Anda mengeluarkan halaman "akses ditolak"!

13
opi

Saya melakukan ini di Boost 7.x. Itu tidak cantik, tapi itu menyelesaikan pekerjaan.

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

Modul Anda dapat memotong nilai "Default 403 (access denied) page" yang dimodifikasi oleh halaman "Administer > Site configuration > Error reporting":

  1. Dalam hook_enable, Menggunakan variable_get/variable_set, salin nilai yang ada ke variabel sekunder dan ganti variabel dengan Anda sendiri path (yang Anda daftarkan menggunakan hook_menu).

  2. bah bentuk "Pelaporan kesalahan" menggunakan hook_form_FORM_ID_alter untuk membaca dari/menulis ke variabel sekunder

  3. Jika Anda ingin benar-benar tidak terlihat oleh pengguna, panggilan balik halaman Anda ke bisa memanggil drupal_goto( the_value_of_the_secondary_variable ).

  4. Dalam hook_disable, pulihkan nilainya dari variabel sekunder.


Dan itu saja, modul Anda mendapat pemberitahuan dengan cara yang bersih (dan tidak terlihat oleh pengguna) ketika "Access ditolak" dipicu.

4
wildpeaks

Tentunya Anda bisa menggunakan fungsi get_headers() PHP?

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

Elemen pertama dalam array yang dikembalikan adalah kode respons. Jika mengandung '403' maka Drupal mengembalikan halaman "akses ditolak".

Saya tidak yakin di mana tempat terbaik untuk meneleponnya. Mungkin hook_exit(), tergantung kebutuhan Anda:

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

2
Greg

Ini adalah cara paling sederhana untuk mendeteksi Access Denied (403) dan Page Not Found (404) di 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