refactor: form login added option register with adjust RegisteredUserController

This commit is contained in:
zhadaarsita 2025-11-11 01:37:21 +07:00
parent 9cd6fd3dd2
commit 34168d5d53
4 changed files with 88 additions and 33 deletions

View File

@ -17,9 +17,13 @@ class RegisteredUserController extends Controller
/** /**
* Menampilkan halaman registrasi. * Menampilkan halaman registrasi.
*/ */
public function create(): View public function create(Request $request): View
{ {
return view('auth.register'); // Bagian Pengambilan Role dari URL
$role = $request->query('role', 'siswa'); // Ambil 'role' dari URL, default ke 'siswa'
// Kirim $role ke view
return view('auth.register', ['role' => $role]);
} }
/** /**
@ -27,27 +31,52 @@ public function create(): View
*/ */
public function store(Request $request): RedirectResponse public function store(Request $request): RedirectResponse
{ {
$request->validate([ // Bagian Validasi Dinamis
'name' => ['required', 'string', 'max:255'], $role = $request->input('role');
'email' => ['required', 'string', 'lowercase', 'email', 'max:255'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
'role' => ['required', 'in:penjaga perpus,siswa'],
]);
$user = new User(); $rules = [
$user->forceFill([ 'name' => ['required', 'string', 'max:255'],
'id' => rand(100, 999), 'password' => ['required', 'confirmed', Rules\Password::defaults()],
'role' => ['required', 'in:siswa,guru'], // Sesuaikan dengan role yang diizinkan
];
// Tambahkan validasi NISN atau NIP berdasarkan role
if ($role === 'siswa') {
$rules['nisn'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu
} else { // Asumsi 'guru'
$rules['nip'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu
}
$request->validate($rules);
// Bagian Pembuatan User
$userArray = [
'id' => rand(100, 999), // ID unik sementara
'nama_lengkap' => $request->name, 'nama_lengkap' => $request->name,
'name' => $request->name, 'name' => $request->name,
'email' => $request->email, 'password' => Hash::make($request->password), // Gunakan Hash jika login Anda sudah pakai Hash
'password' => $request->password, // 'password' => $request->password, // Gunakan ini jika login (LoginRequest) masih cek teks biasa
'role' => $request->role, 'role' => $request->role,
]); ];
// Tambahkan field dinamis (NISN/NIP) dan buat email unik palsu
if ($role === 'siswa') {
$userArray['nisn'] = $request->nisn;
$userArray['email'] = $request->nisn . '@smkn1perpus.sch.id'; // Email unik sementara
} else {
$userArray['nip'] = $request->nip;
$userArray['email'] = $request->nip . '@smkn1perpus.sch.id'; // Email unik sementara
}
$user = new User();
$user->forceFill($userArray);
// $user->save(); // Aktifkan ini jika menggunakan database
event(new Registered($user)); event(new Registered($user));
Auth::login($user); Auth::login($user);
// Bagian Redirect
if ($user->role === 'penjaga perpus') { if ($user->role === 'penjaga perpus') {
return redirect()->route('admin.dashboard'); return redirect()->route('admin.dashboard');
} else { } else {

View File

@ -52,7 +52,7 @@ public function rules(): array
*/ */
public function authenticate(): void public function authenticate(): void
{ {
// Langkah 1: Pastikan pengguna tidak mencoba login terlalu sering (mencegah brute-force). // Pastikan pengguna tidak mencoba login terlalu sering (mencegah brute-force).
$this->ensureIsNotRateLimited(); $this->ensureIsNotRateLimited();
// Ambil data yang dikirim dari form login. // Ambil data yang dikirim dari form login.
@ -64,7 +64,7 @@ public function authenticate(): void
// Tentukan field mana yang akan menerima pesan error jika gagal (nisn atau email). // Tentukan field mana yang akan menerima pesan error jika gagal (nisn atau email).
$errorField = $this->filled('nisn') ? 'nisn' : 'nip'; $errorField = $this->filled('nisn') ? 'nisn' : 'nip';
// Langkah 2: Cari data pengguna berdasarkan input yang diberikan. // Cari data pengguna berdasarkan input yang diberikan.
if ($this->filled('nisn')) { if ($this->filled('nisn')) {
// Jika form diisi dengan 'nisn', cari pengguna berdasarkan 'nisn'. // Jika form diisi dengan 'nisn', cari pengguna berdasarkan 'nisn'.
$userArray = collect($allUsers)->firstWhere('nisn', $this->input('nisn')); $userArray = collect($allUsers)->firstWhere('nisn', $this->input('nisn'));
@ -73,14 +73,12 @@ public function authenticate(): void
$userArray = collect($allUsers)->firstWhere('nip', $this->input('nip')); $userArray = collect($allUsers)->firstWhere('nip', $this->input('nip'));
} }
// Langkah 3: Lakukan Pengecekan Kredensial dan Role. // Lakukan Pengecekan Kredensial dan Role.
// Cek #1: Apakah pengguna ditemukan DAN password yang dimasukkan cocok?
if ($userArray && $userArray['password'] === $inputPassword) { if ($userArray && $userArray['password'] === $inputPassword) {
// Cek #2: Jika kredensial benar, apakah role pengguna sesuai dengan form yang digunakan? // Cek #2: Jika kredensial benar, apakah role pengguna sesuai dengan form yang digunakan?
if (isset($userArray['role']) && $userArray['role'] === $roleDariForm) { if (isset($userArray['role']) && $userArray['role'] === $roleDariForm) {
// --- SEMUA SYARAT TERPENUHI ---
// Buat objek User dari data dummy. // Buat objek User dari data dummy.
$userModel = new User(); $userModel = new User();
$userArray['name'] = $userArray['nama_lengkap']; $userArray['name'] = $userArray['nama_lengkap'];
@ -94,7 +92,6 @@ public function authenticate(): void
return; // Proses autentikasi berhasil. return; // Proses autentikasi berhasil.
} else { } else {
// --- KASUS GAGAL: KREDENSIAL BENAR, TAPI ROLE SALAH ---
// Tambah hitungan percobaan login yang gagal. // Tambah hitungan percobaan login yang gagal.
RateLimiter::hit($this->throttleKey()); RateLimiter::hit($this->throttleKey());
@ -108,7 +105,6 @@ public function authenticate(): void
} }
} }
// --- KASUS GAGAL: KREDENSIAL TIDAK COCOK ---
// Jika pengguna tidak ditemukan atau password salah. // Jika pengguna tidak ditemukan atau password salah.
RateLimiter::hit($this->throttleKey()); RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([ throw ValidationException::withMessages([

View File

@ -51,7 +51,18 @@
<button type="submit" class="btn btn-primary">Masuk</button> <button type="submit" class="btn btn-primary">Masuk</button>
</div> </div>
{{-- Link href untuk ke Register --}}
<p class="mt-4 text-center text-muted small"> <p class="mt-4 text-center text-muted small">
@if ($role == 'siswa')
Belum punya akun?
<a href="{{ route('register', ['role' => 'siswa']) }}" class="fw-semibold text-decoration-none">Daftar sebagai Siswa</a>
@else
Belum punya akun?
<a href="{{ route('register', ['role' => 'guru']) }}" class="fw-semibold text-decoration-none">Daftar sebagai Guru</a>
@endif
</p>
<p class="mt-3 text-center text-muted small">
Kembali ke <a href="/" class="fw-semibold text-decoration-none">halaman utama</a>. Kembali ke <a href="/" class="fw-semibold text-decoration-none">halaman utama</a>.
</p> </p>
</form> </form>

View File

@ -2,11 +2,16 @@
<form method="POST" action="{{ route('register') }}"> <form method="POST" action="{{ route('register') }}">
@csrf @csrf
{{-- Input tersembunyi untuk mengirimkan peran (role) ke backend --}}
<input type="hidden" name="role" value="{{ $role }}">
<div class="text-center mb-4"> <div class="text-center mb-4">
<h3 class="fw-bold text-primary">Buat Akun Siswa</h3> {{-- Judul dinamis --}}
<h3 class="fw-bold text-primary">Buat Akun {{ Str::title($role) }}</h3>
<p class="text-muted">Daftarkan diri Anda untuk mulai menjelajahi koleksi kami.</p> <p class="text-muted">Daftarkan diri Anda untuk mulai menjelajahi koleksi kami.</p>
</div> </div>
{{-- Form Nama Lengkap (Umum) --}}
<div class="mb-3"> <div class="mb-3">
<label for="name" class="form-label">Nama Lengkap</label> <label for="name" class="form-label">Nama Lengkap</label>
<input id="name" class="form-control bg-body-tertiary @error('name') is-invalid @enderror" type="text" name="name" value="{{ old('name') }}" required autofocus autocomplete="name" /> <input id="name" class="form-control bg-body-tertiary @error('name') is-invalid @enderror" type="text" name="name" value="{{ old('name') }}" required autofocus autocomplete="name" />
@ -15,14 +20,26 @@
@enderror @enderror
</div> </div>
<div class="mb-3"> {{-- Form dinamis (NISN untuk Siswa, NIP untuk Guru) --}}
<label for="nisn" class="form-label">Nomor Induk Siswa Nasional (NISN)</label> @if ($role == 'siswa')
<input id="nisn" class="form-control bg-body-tertiary @error('nisn') is-invalid @enderror" type="text" name="nisn" value="{{ old('nisn') }}" required autocomplete="username" /> <div class="mb-3">
@error('nisn') <label for="nisn" class="form-label">Nomor Induk Siswa Nasional (NISN)</label>
<div class="invalid-feedback">{{ $message }}</div> <input id="nisn" class="form-control bg-body-tertiary @error('nisn') is-invalid @enderror" type="text" name="nisn" value="{{ old('nisn') }}" required autocomplete="username" />
@enderror @error('nisn')
</div> <div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
@else
<div class="mb-3">
<label for="nip" class="form-label">Nomor Induk Pegawai (NIP)</label>
<input id="nip" class="form-control bg-body-tertiary @error('nip') is-invalid @enderror" type="text" name="nip" value="{{ old('nip') }}" required autocomplete="username" />
@error('nip')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
@endif
{{-- Form Password (Umum) --}}
<div class="mb-3"> <div class="mb-3">
<label for="password" class="form-label">Password</label> <label for="password" class="form-label">Password</label>
<input id="password" class="form-control bg-body-tertiary @error('password') is-invalid @enderror" type="password" name="password" required autocomplete="new-password" /> <input id="password" class="form-control bg-body-tertiary @error('password') is-invalid @enderror" type="password" name="password" required autocomplete="new-password" />
@ -31,20 +48,22 @@
@enderror @enderror
</div> </div>
{{-- Form Konfirmasi Password (Umum) --}}
<div class="mb-3"> <div class="mb-3">
<label for="password_confirmation" class="form-label">Konfirmasi Password</label> <label for="password_confirmation" class="form-label">Konfirmasi Password</label>
<input id="password_confirmation" class="form-control bg-body-tertiary" type="password" name="password_confirmation" required autocomplete="new-password" /> <input id="password_confirmation" class="form-control bg-body-tertiary" type="password" name="password_confirmation" required autocomplete="new-password" />
</div> </div>
<div class="d-grid mt-4"> <div class="d-grid mt-4">
<button type="submit" class="btn btn-primary btn-lg"> <button type="submit" class="btn btn-primary">
Daftar Daftar
</button> </button>
</div> </div>
{{-- Link Login dinamis --}}
<p class="mt-4 text-center text-muted small"> <p class="mt-4 text-center text-muted small">
Sudah punya akun? Sudah punya akun?
<a href="{{ route('login') }}" class="fw-semibold text-decoration-none">Masuk di sini</a> <a href="{{ route('login', ['role' => $role]) }}" class="fw-semibold text-decoration-none">Masuk di sini</a>
</p> </p>
</form> </form>
</x-guest-layout> </x-guest-layout>