Registrasi
Registration adalah sign-up form pada path dan branding milik Panel, tetapi submit tetap menuju Fortify register endpoint.
Aktifkan Registration untuk Panel tempat user memang boleh membuat account sendiri.
Contohnya:
Customer Portal
Partner Portal
Member Area2
3
Untuk internal/back-office Panel, biasanya Registration dimatikan dan account dibuat oleh administrator atau:
php artisan panel:userContoh Minimal
<?php
declare(strict_types=1);
namespace App\Panels\Portal;
use PandaPanel\Core\Panel;
use PandaPanel\Core\PanelProvider;
final class PortalPanelProvider
extends PanelProvider
{
public function panel(
Panel $panel
): Panel {
return $panel
->path('portal')
->auth(
verified: false
)
->login()
->registration();
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Routes:
php artisan route:list --name=panel.portal.authGET portal/login panel.portal.auth.login
GET portal/register panel.portal.auth.register2
Login Page sekarang memiliki Sign Up link.
/portal/register merender Form yang submit ke:
POST /registerAPI
public function registration(
bool $registration = true
): self;
public function hasRegistration():
bool;2
3
4
5
6
Tiga reader:
| Reader | Jika false |
|---|---|
| Route registrar | Registration route tidak tersedia |
PanelAuthController::register() | 404 |
| Login Page | canRegister=false sehingga link tidak tampil |
Contoh:
use PandaPanel\Core\PanelManager;
$panel =
app(PanelManager::class)
->get('portal');
$panel->hasRegistration();
// true2
3
4
5
6
7
8
Registration membutuhkan:
login()Jika Login tidak aktif, registration route tidak diregistrasikan.
Props
public function register():
Response
{
abort_unless(
$this
->panel()
->hasRegistration(),
404
);
return Inertia::render(
'panel/auth/Register',
[
'panel' =>
$this
->panel()
->toSharedArray(),
'passwordRules' =>
PasswordRules::attribute(),
]
);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| Prop | Type | Sumber |
|---|---|---|
panel | PanelDefinition | Panel |
passwordRules | string | PasswordRules::attribute() |
Tidak ada:
status
canLogin2
Page selalu dapat kembali ke:
/{panel.path}/loginkarena Registration tidak tersedia tanpa Login.
Password Policy di Browser
PandaPanel\Support\PasswordRules menerjemahkan Laravel Password policy ke passwordrules browser attribute.
API:
public static function attribute(
?Illuminate\Validation\Rules\Password $password = null
): string;2
3
Tanpa argument:
Password::defaults()digunakan.
Contoh:
PasswordRules::attribute(
Password::min(8)
);
// minlength: 8;2
3
4
5
PasswordRules::attribute(
Password::min(12)
->max(64)
->mixedCase()
->numbers()
->symbols()
);2
3
4
5
6
7
Hasil:
minlength: 12;
maxlength: 64;
required: lower;
required: upper;
required: digit;
required: special;2
3
4
5
6
Mapping:
| Laravel Policy | Browser Attribute |
|---|---|
min(n) | minlength: n |
max(n) | maxlength: n |
letters() | required: lower |
mixedCase() | lower + upper |
numbers() | required: digit |
symbols() | required: special |
Pada Laravel 13 framework dapat menggunakan toPasswordRulesString().
Pada Laravel 12 PandaBear membangun string dari appliedRules() dengan output yang sama.
Perlu diingat:
passwordRuleshanya browser hint.
Validation authoritative tetap berada di backend.
Submit Form
<script setup lang="ts">
import { Form } from '@inertiajs/vue3';
import { store } from '@/routes/register';
</script>
<template>
<Form
v-bind="store.form()"
:reset-on-success="[
'password',
'password_confirmation',
]"
>
<!--
name
email
password
password_confirmation
-->
</Form>
</template>2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
store adalah Fortify:
POST /register
route: register.store2
Field:
name
email
password
password_confirmation2
3
4
diterima oleh Fortify CreateNewUser action.
Bagaimana User Dibuat
PandaBear tidak membuat user.
Fortify memanggil action milik application:
use App\Actions\Fortify\CreateNewUser;
use Laravel\Fortify\Fortify;
Fortify::createUsersUsing(
CreateNewUser::class
);2
3
4
5
6
Contoh aman:
<?php
declare(strict_types=1);
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Laravel\Fortify\Contracts\CreatesNewUsers;
final class CreateNewUser
implements CreatesNewUsers
{
/**
* @param array<string, mixed> $input
*/
public function create(
array $input
): User {
Validator::make(
$input,
[
'name' => [
'required',
'string',
'max:255',
],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(
User::class
),
],
'password' => [
'required',
'string',
'min:8',
'confirmed',
],
]
)->validate();
return User::create([
'name' =>
$input['name'],
'email' =>
$input['email'],
'password' =>
Hash::make(
$input['password']
),
]);
}
}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
51
52
53
54
55
56
57
58
59
60
61
62
63
Menuliskan attribute secara eksplisit merupakan security boundary.
Jangan membuat privilege field seperti:
is_adminmass assignable melalui public registration.
Register Tidak Sama dengan Diterima Masuk Panel
Fortify membuat user lalu sign-in.
Tetapi pada request berikutnya ResolvePanel masih memeriksa:
$panel
->isAccessibleTo(
$user
);2
3
4
yang mempertimbangkan:
Panel::canAccess()
+
PanelUser::canAccessPanel()2
3
Jadi public Registration pada Panel dengan restrictive access dapat menghasilkan:
register sukses
↓
sign-in sukses
↓
Panel access 4032
3
4
5
Jika memang workflow-nya:
register
↓
menunggu approval2
3
lebih baik user tetap diizinkan masuk ke suatu area yang menjelaskan status approval, lalu sensitive content digate secara terpisah.
Verification Flow
Contoh User Model:
public function canAccessPanel(
Panel $panel
): bool {
return $this
->hasVerifiedEmail();
}2
3
4
5
6
Tetapi sebagaimana dijelaskan di Email Verification, pendekatan ini menghasilkan 403 jika dikombinasikan secara tidak tepat dengan Panel verification notice.
Untuk UX redirect verification, gunakan verified middleware dengan route yang tepat.
Hal yang Perlu Diperhatikan
- Fortify feature dan Panel flag harus sama-sama aktif.
- Panel
/registerdapat tetap render saat Fortify feature mati, tetapiPOST /registertidak tersedia. passwordRuleshanya browser hint.- Backend validation tetap berasal dari
CreatesNewUsers. - Tidak ada per-Panel registration action.
- Semua Panel menggunakan satu
Fortify::createUsersUsing(). - Jika perlu tenant/role berdasarkan Panel, application action dapat membaca current Panel.
- Account baru default-nya unverified.
auth()default menambahkanverified; tanpa Panel Email Verification Page user diarahkan ke generic application notice.