Secara program mengarahkan pengguna ke "akses terbatas" default

12

Saya ingin secara program mengarahkan pengguna saya ke halaman "akses terbatas". Saya tahu bahwa saya memerlukan objek "RedirectResponse" untuk pengalihan sederhana, tetapi bagaimana cara menentukan halaman "akses terbatas" default di sini?

jepster
sumber
1
Biasanya, halaman "dibatasi akses" dihasilkan dengan mengembalikan kode status 403, bukan mengarahkan ke halaman lain. Apakah Anda mencoba sesuatu sepertireturn new Response('', Response::HTTP_FORBIDDEN);
Pierre Buyle

Jawaban:

24

Anda bisa melempar pengecualian kapan saja dalam kode Anda:

403:

throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException();

404:

throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();

Pengecualian kemudian ditangkap oleh DefaultExceptionHtmlSubscriber dan subrequest untuk /system/403atau /system/404dikembalikan, yang dapat Anda konfigurasi di pengaturan situs dasar jika Anda tidak ingin menampilkan halaman "akses ditolak" atau "tidak ditemukan" generik.

Opsi lain bergantung pada tempat kode ditempatkan:

  • Kembalikan respons 403 atau 404 dari pengontrol atau formulir

  • Tetapkan respons dalam suatu acara jika Anda berada dalam pelanggan acara.

Yang tidak boleh Anda lakukan adalah mengirim respons secara langsung. Ini tidak menghentikan kode dan menghasilkan dua tanggapan, satu Anda telah mengirim dan satu lagi dikembalikan oleh kernel Drupal. Ini akan menghasilkan perilaku yang tidak terduga.

4k4
sumber
2

Ini sepertinya cara yang benar:

    $response = new RedirectResponse('/system/403');
    $event->setResponse($response);
jepster
sumber
2

Bangun pengalihan Anda dari rute yang ditolak akses sistem.

$url = Url::fromRoute('system.403');
$response = new RedirectResponse($url->toString());

Ini membawa Anda ke halaman ditolak akses standar Drupal. Rute didefinisikan system.routing.ymldalam inti.

Jawaban teratas akan memberi Anda Access tampak ditolak berbasis browser Ditolak, yang mungkin apa yang Anda cari. Jika Anda ingin tampilan Drupal UI Anda, gunakan di atas.

CliveCleaves
sumber
0

Dari sebuah halaman, Anda dapat menggunakan:

return new \Symfony\Component\HttpFoundation\RedirectResponse(\Drupal::url('your.module.route.name'));

seperti: http://www.drupal8.ovh/en/tutoriels/88/page-redirection-on-drupal-8

Atau dari dari kirim:

$form_state->setRedirect('your.module.route.name');

Kemudian konfigurasikan izin akses 'your.module.route.name'

Jika Anda tidak tahu cara mengkonfigurasi izin akses, periksa: http://www.drupal8.ovh/en/tutoriels/66/create-a-custom-permission-drupal-8

Bersih
sumber
Saya telah mencoba $ response = Respon baru ('', Response :: HTTP_FORBIDDEN); $ event-> setResponse ($ response); ini hanya menampilkan halaman putih untuk pengguna. Itu informasi yang terlalu sedikit. Saya ingin menampilkan halaman "akses ditolak" default dari Drupal.
jepster