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

16

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

kiamlaluno
sumber

Jawaban:

13

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

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

opi
sumber
Ini bukan solusi yang baik bagi saya karena ini mengubah output, tidak hanya mendeteksi 403.
Fabien Quatravaux
12

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;

      // …

    }
    // …
  }
  // …   
}
mikeytown2
sumber
Ini adalah peretasan besar tetapi berhasil: apa yang Anda lakukan disebut pembajakan. Anda mencolokkan kode Anda sendiri pada titik sebelumnya, dan kemudian mereproduksi kode inti dengan modifikasi minimal.
Fabien Quatravaux
10

Di Drupal 7, fungsi yang mengembalikan header HTTP yang sudah ditetapkan adalah drupal_get_http_header () , yang membutuhkan nama header HTTP sebagai parameter. Melihat kode authorize_access_denied_page () , dan drupal_fast_404 () 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 , maka Drupal menampilkan halaman yang ditolak aksesnya.

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

kiamlaluno
sumber
Yang ini benar-benar jawaban yang bagus. Hanya satu hal yang perlu diperhatikan: tampaknya berfungsi hanya jika halaman tidak di-cache. Jika halaman tersebut telah diakses sebelumnya, drupal_get_http_header('Status')hasilnya kembali NULL.
Fabien Quatravaux
4

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

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

  2. ubah formulir "Pelaporan kesalahan" menggunakan hook_form_FORM_ID_alteruntuk membaca dari / menulis ke variabel sekunder

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

  4. Di hook_disable, kembalikan nilai dari variabel sekunder.


Dan itu saja, modul Anda akan diberitahukan dengan cara yang bersih (dan tidak terlihat oleh pengguna) ketika "Akses ditolak" dipicu.

wildpeaks
sumber
2

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']);
Lindsay
sumber
-2

Anda dapat menggunakan modul Panel untuk ini.

Modul Panel memungkinkan administrator situs untuk membuat tata letak yang disesuaikan untuk berbagai keperluan. Pada intinya itu adalah drag and drop content manager yang memungkinkan Anda mendesain tata letak secara visual dan menempatkan konten di dalam tata letak itu. Integrasi dengan sistem lain memungkinkan Anda untuk membuat node yang menggunakan ini, halaman arahan yang menggunakan ini, dan bahkan menimpa halaman sistem seperti taksonomi dan halaman simpul sehingga Anda dapat menyesuaikan tata letak situs Anda dengan izin berbutir sangat halus.

Umuthan Uyan
sumber