Redirect Guest
Dokumentasi ini menjelaskan ke mana guest diarahkan ketika membuka URL sebuah Panel: ke Login Page milik Panel tersebut jika tersedia, atau ke route login milik application jika Panel tidak memiliki Login Page. Package mendaftarkan aturan ini secara otomatis kecuali config mematikannya.
Gunakan halaman ini ketika redirectGuestsTo() milik application berhenti berpengaruh, atau ketika guest diarahkan ke Login Page yang salah.
Contoh minimal yang berfungsi
// config/panda-panel.php
'register_guest_redirect' => true,2
3
// A panel with its own front door.
$panel->path('door')->auth()->login();2
3
$this->get('/door')->assertRedirect('/door/login');
session('url.intended'); // '…/door' — they land where they were going2
3
Panel yang tidak pernah memanggil login() tidak memiliki route login sendiri. Guest yang membuka Panel tersebut akan diarahkan ke route('login'), sama seperti behavior default Laravel.
Artinya mengaktifkan feature ini menambahkan satu kemungkinan redirect, bukan mengganti behavior Laravel untuk seluruh request.
PandaPanel\Support\PanelLoginRedirect
public static function for(Request $request): ?stringHanya ada satu method, dengan seluruh keputusan berikut:
$panel = app(PanelManager::class)->resolveFromRequest($request);
if ($panel === null || ! $panel->hasLogin()) {
return Route::has('login') ? route('login') : null;
}
$login = $panel->routeName('auth.login');
return Route::has($login) ? route($login) : null;2
3
4
5
6
7
8
9
| Request | Hasil |
|---|---|
Berada di dalam Panel yang memanggil login() | route('panel.{id}.auth.login'), absolute |
| Berada di dalam Panel yang tidak memiliki Login Page | route('login') jika application memilikinya |
| Berada di luar Panel | route('login') jika application memilikinya |
| Tidak ada route yang sesuai | null |
Kedua pemeriksaan Route::has() penting.
Route login milik Panel baru benar-benar ada setelah route Panel diregistrasikan. Tanpa pemeriksaan ini, Panel dengan login yang dinonaktifkan setelah boot, atau application dengan register_routes => false, dapat mencoba redirect ke route name yang sebenarnya tidak tersedia.
Hasil null bukan failure mode buatan package. Illuminate\Auth\Middleware\Authenticate akan melempar AuthenticationException dengan redirect null, lalu Laravel handler memberikan response()->noContent(401).
Request JSON bahkan tidak menggunakan callback redirect ini. Untuk request yang mengharapkan JSON, Authenticate menggunakan null dan handler memberikan response 401 beserta message yang sesuai.
Anda juga dapat memanggil resolver yang sama dari code sendiri:
use PandaPanel\Support\PanelLoginRedirect;
PanelLoginRedirect::for($request); // string|null
PanelLoginRedirect::for(...); // first-class callable, which is how it is registered2
3
4
Bagaimana redirect ini didaftarkan
private function registerGuestRedirect(): void
{
if ($this->app->make('config')->get('panda-panel.register_guest_redirect') !== true) {
return;
}
$redirect = static function (): void {
Authenticate::redirectUsing(PanelLoginRedirect::for(...));
AuthenticationException::redirectUsing(PanelLoginRedirect::for(...));
};
if ($this->app->resolved(Kernel::class)) {
$redirect();
}
$this->app->afterResolving(Kernel::class, $redirect);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Package memasang dua static callback:
- pada
Illuminate\Auth\Middleware\Authenticate; - pada
Illuminate\Auth\AuthenticationException.
Callback pertama menangani middleware auth. Callback kedua menangani AuthenticationException yang dilempar dari lokasi lain, termasuk Fortify.
Hook afterResolving() bukan sekadar detail implementasi. Laravel sendiri mendaftarkan default fn () => route('login') di dalam hook afterResolving(Kernel::class) miliknya. Jika provider mengatur redirect terlalu awal, konfigurasi tersebut akan ditimpa ketika HTTP Kernel di-resolve.
Karena itu PandaBear memasang hook yang berjalan setelah hook Laravel. Pemanggilan $redirect() secara langsung juga menangani kondisi ketika Kernel sudah terlanjur di-resolve.
Behavior ini aman dipasang dari provider karena PanelLoginRedirect merupakan superset dari default Laravel:
- request non-Panel tetap fallback ke
route('login'); - Panel tanpa Login Page juga fallback ke
route('login'); - hanya Panel yang memiliki Login Page sendiri yang mendapatkan tujuan berbeda.
Satu-satunya behavior application yang dapat tertimpa adalah custom guest redirect milik application. Itulah alasan config key ini tersedia.
Mempertahankan rule redirect milik application
// config/panda-panel.php
'register_guest_redirect' => false,2
3
Kemudian atur sendiri di bootstrap/app.php:
// bootstrap/app.php
use Illuminate\Foundation\Configuration\Middleware;
use PandaPanel\Support\PanelLoginRedirect;
->withMiddleware(function (Middleware $middleware): void {
$middleware->redirectGuestsTo(
fn ($request) => PanelLoginRedirect::for($request) ?? route('welcome'),
);
})2
3
4
5
6
7
8
9
10
redirectGuestsTo() adalah tempat resmi Laravel untuk menentukan behavior ini dan menjadi keputusan akhir karena dijalankan di hook framework yang sama.
PanelLoginRedirect::for() sendiri sudah fallback ke route('login') jika request bukan milik Panel. Jadi branch ?? route('welcome') hanya dijalankan ketika application sama sekali tidak memiliki route bernama login.
Jika register_guest_redirect dimatikan tanpa menyediakan replacement, default Laravel tetap berlaku: semua guest, termasuk yang membuka Panel dengan Login Page sendiri, diarahkan ke route('login').
Hal yang tidak dicakup behavior ini
AuthenticateSession. LaravelredirectGuestsTo()juga mengarahkanIlluminate\Session\Middleware\AuthenticateSession::redirectUsing()ke callback yang sama. PandaBear hanya mengatur dua callback yang dijelaskan di atas. Jika Anda menggunakanAuthenticateSessiondan membutuhkan redirect yang sadar Panel, daftarkan sendiri callback tersebut.- Tujuan user setelah berhasil login. Itu merupakan tanggung jawab Fortify. Pendamping fitur ini di sisi Panel adalah Home Redirect.
- Authorization. User yang sudah login tetapi gagal
canAccess()mendapatkan 403 dariResolvePanel, bukan redirect. Menempatkan Panel di balik Login Page bukan access control.
Prasyarat pada Panel
Redirect hanya dapat menuju Login Page Panel jika route tersebut benar-benar ada:
$panel
->login() // GET {path}/login → panel.{id}.auth.login
->registration() // GET {path}/register
->passwordReset() // GET {path}/forgot-password, {path}/reset-password/{token}
->emailVerification(); // GET {path}/verify-email2
3
4
5
panel('door')->hasLogin(); // bool — what PanelLoginRedirect asksAuth Page tersebut diregistrasikan di luar auth middleware stack milik Panel. Route hanya menggunakan base middleware Panel dan ResolvePanel.
Login Page tidak boleh berada di balik auth, karena user yang belum login justru harus dapat membuka Page yang memintanya login.
Form pada Page tersebut submit ke endpoint Fortify milik application, bukan endpoint duplicate per Panel. Menduplikasi Login POST berarti framework juga harus menduplikasi rate limiting, two-factor authentication, Passkey, dan session handling.
Hal yang perlu diperhatikan
- Config key dibandingkan dengan
!== true. String'false'maupun'true'dari environment variable akan menonaktifkan registration karena keduanya bukan booleantrue. resolveFromRequest()menentukan Panel berdasarkan longest path prefix dandomain(). Jika ada Panel pada/admindan/admin/reports, guest yang membuka/admin/reports/xdiarahkan ke Login Page milik Panel kedua.- URL yang dikembalikan bersifat absolute, karena
route()dipanggil tanpaabsolute: false. Berbeda dengan Home Redirect yang menggunakan relative URL. Perbedaan ini disengaja karena guest redirect dapat secara valid berpindah ke Panel pada domain lain. url.intendedadalah behavior Laravel. Nilai tersebut disimpan olehredirect()->guest(). PandaBear tidak menambahkan mekanisme lain, sehingga login melalui front door Panel tetap membawa user kembali ke URL yang semula ingin dibuka.- Jika redirect ini dan custom
redirectGuestsTo()milik application sama-sama aktif, custom rule application yang didaftarkan lebih akhir akan menang. Config key ini membuat keputusan tersebut eksplisit sehingga tidak terasa seperti behavior misterius.