Saya ingin mengarahkan pengguna anonim ke formulir login jika pengguna tersebut menemukan kesalahan 403.
Saya telah membuat pelanggan acara dan ini adalah kode saya, tetapi saya berakhir di loop pada halaman saat ini.
/**
* Redirect anonymous user to login page if he encounters 404 or 403
* response.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
* The created response object that will be returned.
* @param string $event
* The string representation of the event.
* @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
* Event dispatcher that lazily loads listeners and subscribers from the dependency injection
* container.
*/
public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
$routeMatch = RouteMatch::createFromRequest($response->getRequest());
$route_name = $routeMatch->getRouteName();
$is_anonymous = \Drupal::currentUser()->isAnonymous();
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
$query = $response->getRequest()->query->all();
// $query['destination'] = $routeMatch->getRouteObject()->getPath();
$query['destination'] = \Drupal::url('<current>');
$login_uri = \Drupal::url('user.login', [], ['query' => $query]);
$returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
$response->setResponse($returnResponse);
}
}
Saya pikir ini terkait dengan fakta bahwa respons sudah berisi tujuan (uri saat ini) dan system.404 dan system.403 memiliki beberapa prioritas tinggi yang mencegah saya untuk menimpa ini.
8
routes
redirection
Pierre
sumber
sumber
Jawaban:
Saya telah melihat bahwa pertanyaan ini tidak pernah dijawab bagaimana melakukan ini secara terprogram. Kode ini benar-benar berfungsi, ketika ditempatkan dalam Pelanggan Pengecualian:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
sumber
Cara termudah adalah dengan browse ke
/admin/config/system/site-information
dan mengisi di bidang yang berbunyiDefault 403 (access denied) page
denganuser/login
sumber
Hanya dengan melihat judul pertanyaan ini (= Bagaimana cara mengarahkan pengguna ke formulir login dari 403? ), Ada 2 opsi untuk melakukannya, tanpa melibatkan kode kustom, seperti dirinci di bawah ini.
Opsi 1: Gunakan modul CustomError
The CustomError modul memungkinkan admin situs untuk membuat halaman kesalahan kustom untuk kode status HTTP 403 (akses ditolak) dan 404 (tidak ditemukan), tanpa menciptakan node untuk masing-masing. Beberapa detail lebih lanjut tentang fitur-fiturnya (dari halaman proyeknya):
Anda mungkin akan lebih tertarik pada bagian tentang " Pengguna yang tidak masuk dan mencoba mengakses area yang memerlukan login akan diarahkan ke halaman yang mereka coba akses setelah mereka login. ".
Untuk D8 ada juga versi 8.x-1.x-dev untuk modul ini yang tersedia juga, perincian lebih lanjut tentang hal ini dapat ditemukan di Edisi # 2219227 .
Opsi 2: Gunakan modul Aturan
Asumsikan jalur halaman "Default 403" diatur ke
no_access
(via admin). Kemudian buat aturan menggunakan modul Aturan , dengan sebagai Peristiwa sesuatu seperti "Setelah mengunjungi simpulno_access
". Sehingga seluruh aturan akan terlihat seperti ini:no_access
Kondisi:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Tindakan: Pengalihan halaman -
Parameter: URL: user/login
Jika Anda ingin melakukannya, Anda bahkan dapat menambahkan Tindakan lain untuk juga menampilkan beberapa pesan (informasi) di area pesan Drupal, dengan sesuatu seperti "Anda mencoba mengunjungi halaman yang memerlukan login ...".
Benar, itu mungkin mengharuskan Anda untuk mengaktifkan modul kontribusi tambahan ( Aturan ). Tetapi, seperti yang ditunjukkan oleh popularitasnya yang meningkat, modul itu mungkin sudah diaktifkan di sebagian besar situs mana pun (mirip dengan modul Views ), karena ada lusinan kasus penggunaan untuk modul ini.
Untuk D8 ada versi 8.x-3.x-alfa1 untuk modul ini juga tersedia, rincian lebih lanjut tentang versi D8 dapat ditemukan di Edisi # 2574691 , yang mencakup tautan ke masalah Peraturan " Aturan 8.x Roadmap "
Jika hal di atas tidak membantu, maka Anda mungkin ingin memeriksa apakah alasan untuk loop Anda (atau "beberapa prioritas tinggi" seperti dalam pertanyaan Anda) tidak dapat dicegah / dijelaskan dengan sesuatu yang mirip dengan jawaban pertanyaan " Cara menentukan acara Aturan seperti "Konten akan 'dilihat"? ".
sumber
Saya kira solusi untuk masalah Anda sederhana. Anda dapat dengan mudah membuat halaman kustom untuk
404
dan403
kemudian di dalam halaman ini, mengarahkan pengguna anonim ke/user
halaman.Anda dapat menggunakan kode ini
Setiap kali 404 terjadi, Anda
page--404.tpl.php
akan digunakan. Di halaman ini gunakan kode iniHalaman Cara membuat halaman 403 dan 404 kustom di Drupal menjelaskan metode lain untuk membuat halaman untuk
403
dan404
.sumber
8
formatCara termudah untuk melakukannya adalah dengan menggunakan modul Redirect 403 ke User Login (versi dev itu ada untuk D8). Berikut adalah kutipan tentang hal itu (dari halaman proyeknya):
sumber
7
dan6
(1) buat simpul halaman dengan alias seperti "/my403.html"
(2) buka / admin / config / system / informasi-situs dan set "/my403.html" sebagai 403-Errorpage
(3) buka / admin / structure / block dan tambahkan blok "User login" (Formulir Sec.) Ke wilayah konten utama. Batasi tampilan blokir ke halaman "my403.html" dan peran "tamu".
Itu dia.
Jika Anda membutuhkan lebih banyak kontrol, buat pengontrol untuk halaman 403 Anda dan tambahkan UserLoginForm dengan tangan.
Salam, Rainer
sumber