Integrasi Fortify
PandaBear tidak mengimplementasikan proses login sendiri.
PandaBear menyediakan auth screens:
- Login;
- Registration;
- Password Reset;
- Email Verification;
dengan branding dan path milik masing-masing Panel.
Tetapi semua request write authentication tetap dikirim ke:
Laravel Fortifyyang merupakan dependency package.
Gunakan dokumentasi ini ketika:
- sebuah Panel membutuhkan auth front door sendiri;
- Anda ingin mengetahui behavior mana yang dimiliki PandaBear;
- dan behavior mana yang tetap menjadi tanggung jawab Fortify/application.
Contoh Minimal
<?php
declare(strict_types=1);
namespace App\Panels\Admin;
use PandaPanel\Core\Panel;
use PandaPanel\Core\PanelProvider;
final class AdminPanelProvider
extends PanelProvider
{
public function panel(
Panel $panel
): Panel {
return $panel
->path('admin')
->auth()
->login()
->passwordReset();
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Periksa:
php artisan route:list --name=panel.admin.authGET admin/login panel.admin.auth.login
GET admin/forgot-password panel.admin.auth.password.request
GET admin/reset-password/{token} panel.admin.auth.password.reset2
3
Guest yang membuka:
/adminakan diarahkan ke:
/admin/loginmelihat branding Panel, tetapi form login dikirim ke endpoint Fortify.
Mengapa Form Tetap Milik Fortify
Jika PandaBear membuat login POST untuk setiap Panel, berarti framework juga harus menggandakan:
- rate limiting;
- session regeneration;
- remember-me;
- TOTP;
- recovery code;
- passkey;
- session fixation prevention.
Hal-hal tersebut tidak boleh memiliki behavior berbeda di dua pintu menuju application yang sama.
Pembagian tanggung jawab:
| Concern | Owner |
|---|---|
| Page Login/Register/Reset/Verify | PandaBear |
| POST Login/Register/Reset/Verify | Fortify |
| Throttling | Fortify |
| Session regeneration | Fortify |
| Remember-me | Fortify |
| TOTP + recovery code | Fortify |
| Passkey registration/login | Fortify + laravel/passkeys |
| Pembuatan user baru | Fortify::createUsersUsing() milik application |
| Email Code second factor | PandaBear |
| Boleh masuk ke Panel atau tidak | PandaBear |
Email Code merupakan satu auth-related concern yang PandaBear implementasikan sendiri.
Tetapi fitur tersebut sengaja berada setelah login, bukan di dalam Fortify login POST.
Mengharuskan Signed-In User
Shortcut:
public function auth(
bool $verified = true
): self;2
3
Default:
$panel->auth();
// menambahkan:
[
'auth',
'verified',
]2
3
4
5
6
7
Tanpa email verification enforcement:
$panel->auth(
verified: false
);
// menambahkan:
[
'auth',
]2
3
4
5
6
7
8
Base Middleware vs Auth Middleware
Kedua stack dipisahkan karena auth Page membutuhkan base middleware tetapi tidak boleh menggunakan auth.
| Method | Signature | Default | Arti |
|---|---|---|---|
middleware() | middleware(array $middleware): self | ['web'] | Mengganti base stack |
authMiddleware() | authMiddleware(array $middleware): self | ['auth'] | Mengganti auth stack |
getBaseMiddleware() | getBaseMiddleware(): array | — | Base stack saja |
getAuthMiddleware() | getAuthMiddleware(): array | — | Auth stack saja |
getMiddleware() | getMiddleware(): array | — | Base + auth, deduplicated |
Contoh:
use App\Http\Middleware\EnsureOnCorporateNetwork;
$panel
->middleware([
'web',
EnsureOnCorporateNetwork::class,
])
->auth();
$panel->getBaseMiddleware();
// [
// 'web',
// EnsureOnCorporateNetwork::class,
// ]
$panel->getAuthMiddleware();
// [
// 'auth',
// 'verified',
// ]
$panel->getMiddleware();
// [
// 'web',
// EnsureOnCorporateNetwork::class,
// 'auth',
// 'verified',
// ]2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Default auth stack sudah melindungi Panel dari guest.
Framework Middleware Order
PanelRouteRegistrar menggabungkan middleware kemudian menambahkan:
...panel middleware...
ResolvePanel:{id}
→ bind Panel dan cek Panel access
RequireTwoFactor:{id}
→ no-op kecuali Panel requireTwoFactor()
RequireEmailCode:{id}
→ no-op kecuali account mengaktifkan email code
ResolveTenant:{id}
→ hanya jika Panel menggunakan tenancy2
3
4
5
6
7
8
9
10
11
12
13
Auth Pages seperti Login diregistrasikan di luar authenticated Panel group.
Auth Page hanya menggunakan:
base middleware
+
ResolvePanel2
3
Jika Login Page diberi auth, guest akan terjebak dalam redirect loop.
Empat Front-Door Toggle
Semua default:
off| Method | Signature | Reader | Route |
|---|---|---|---|
login() | login(bool $login = true): self | hasLogin() | auth.login |
registration() | registration(bool $registration = true): self | hasRegistration() | auth.register |
passwordReset() | passwordReset(bool $passwordReset = true): self | hasPasswordReset() | auth.password.request, auth.password.reset |
emailVerification() | emailVerification(bool $emailVerification = true): self | hasEmailVerification() | auth.verification.notice |
Contoh:
$panel
->auth()
->login()
->registration()
->passwordReset()
->emailVerification();2
3
4
5
6
login() merupakan gate utama.
Jika:
hasLogin() === falseregisterAuth() tidak mendaftarkan tiga fitur lain.
Masing-masing Page juga melakukan abort_unless() berdasarkan flag-nya sendiri.
Route Name
use PandaPanel\Core\PanelManager;
$panel =
app(PanelManager::class)
->get('admin');
$panel->routeName(
'auth.login'
);
// panel.admin.auth.login2
3
4
5
6
7
8
9
10
Require Second Factor
API:
public function requireTwoFactor(
bool $required = true
): self;
public function requiresTwoFactor():
bool;2
3
4
5
6
Contoh:
$panel
->auth()
->requireTwoFactor();2
3
RequireTwoFactor akan menahan user di Security Settings sampai account memiliki salah satu:
TOTP
Email Code
Passkey2
3
Checks:
$user
->hasEnabledTwoFactorAuthentication();
EmailCodeFactor::isEnabledFor(
$user
);
$user
->passkeys()
->exists();2
3
4
5
6
7
8
9
10
Passkey dianggap second factor yang valid.
Fortify Features yang Dibaca PandaBear
PandaBear tidak mengaktifkan Fortify features.
Framework hanya membacanya.
| Call Site | Fortify Check | Dampak |
|---|---|---|
| Login | resetPasswords() | Menentukan canResetPassword |
| Login | registration() | Menentukan canRegister |
| Security Settings | canManageTwoFactorAuthentication() | Menampilkan TOTP card |
| Security Settings | canManagePasskeys() | Menampilkan Passkey card |
| Security Settings | option confirm | Menentukan apakah setup TOTP harus dikonfirmasi |
Login link seperti Registration membutuhkan dua kondisi:
Fortify feature aktif
AND
Panel flag aktif2
3
Jika Panel mengaktifkan registration tetapi Fortify feature mati, Registration Page masih dapat dirender tetapi POST target tidak ada.
Jadi konfigurasi harus konsisten.
Yang Tetap Menjadi Tanggung Jawab Application
1. FortifyServiceProvider
PandaBear Page tidak menggantikan application auth screen.
Contoh:
<?php
declare(strict_types=1);
namespace App\Providers;
use App\Actions\Fortify\CreateNewUser;
use Illuminate\Support\ServiceProvider;
use Inertia\Inertia;
use Inertia\Response;
use Laravel\Fortify\Fortify;
final class FortifyServiceProvider
extends ServiceProvider
{
public function boot(): void
{
Fortify::createUsersUsing(
CreateNewUser::class
);
Fortify::loginView(
static fn (): Response =>
Inertia::render(
'auth/Login'
)
);
Fortify::registerView(
static fn (): Response =>
Inertia::render(
'auth/Register'
)
);
Fortify::confirmPasswordView(
static fn (): Response =>
Inertia::render(
'auth/ConfirmPassword'
)
);
Fortify::twoFactorChallengeView(
static fn (): Response =>
Inertia::render(
'auth/TwoFactorChallenge'
)
);
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
confirmPasswordView() penting jika Panel tetap menggunakan Security Settings karena Page tersebut berada di balik RequirePassword.
2. User Model
PandaBear dapat membutuhkan beberapa capability tergantung fitur:
Notifiable;TwoFactorAuthenticatable;PanelUser;PasskeyUser;HasPanelTenants.
Lihat User Model Requirements.
3. Host Frontend Modules
Published Vue component menggunakan modules seperti:
@/routes/login
@/routes/register
@/routes/password
@/routes/two-factor
@/routes/verification
@/actions/Laravel/Passkeys/Http/Controllers/PasskeyRegistrationController2
3
4
5
6
Module tersebut dihasilkan Wayfinder dari route application.
panel:install memeriksa dependency tersebut dan melaporkan module yang hilang.
Guest Redirect
Class:
PandaPanel\Support\PanelLoginRedirectAPI:
public static function for(
Request $request
): ?string;2
3
Behavior:
Request resolve ke Panel
dan Panel punya login
→ Panel login
Tidak ada Panel login
→ route('login')
Tidak ada application login route
→ null2
3
4
5
6
7
8
9
Package mendaftarkan behavior tersebut ke:
Authenticate::redirectUsing()dan:
AuthenticationException::redirectUsing()melalui afterResolving(Kernel::class).
Jika ingin menggunakan custom guest redirect:
// config/panda-panel.php
'register_guest_redirect' =>
false,2
3
4
Kemudian:
// 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
11
12
13
14
15
16
17
18
19
Redirect Setelah Login
Fortify menggunakan:
redirect()
->intended(
Fortify::redirects(
'login'
)
);2
3
4
5
6
Jika guest awalnya mencoba membuka:
/admin/users/3/editkemudian diarahkan ke login, intended URL akan membawa mereka kembali ke record tersebut setelah login berhasil.
Jika user membuka Login Page secara langsung, tidak ada intended URL.
Fortify kemudian menggunakan configured home, biasanya:
/dashboardRedirectPanelHome dapat mengarahkan signed-in user dari starter kit /dashboard ke Panel pertama yang dapat mereka akses.
Configuration:
'home_redirect' => [
'enabled' =>
true,
'paths' => [
'dashboard',
],
],2
3
4
5
6
7
8
Hal yang Perlu Diperhatikan
login()pada public Panel dapat menghasilkan Login Page yang sebenarnya tidak diperlukan.- Panel Reset Password Page bukan otomatis tujuan link email reset.
auth()merge, bukan replace.authMiddleware()replace.- Fortify
homeconfiguration tidak dimodifikasi oleh PandaBear. - Route cache aman karena PandaBear route menggunakan controller method, bukan closure.