Inventaris Lab Laravel 12 : Bagian #06 - MEMBUAT FITUR AUTENTIKASI (LOGIN) & PENYESUAIAN UI
Belajar Bareng Minarsih - Edisi Ngoding
09 Oktober 2025
Tujuan: Di bagian ini, kita akan memasang sistem autentikasi penuh menggunakan Laravel Breeze. Kita akan membedah bagaimana Breeze bekerja, mulai dari rute, controller, hingga view, lalu mengintegrasikannya secara sempurna dengan template admin kita, termasuk membuat header menjadi dinamis sesuai status login pengguna.
Langkah pertama adalah menambahkan Laravel Breeze ke dalam proyek kita. Breeze akan secara otomatis membuatkan semua file yang kita butuhkan untuk sistem autentikasi.
composer require laravel/breeze --dev
php artisan breeze:install
npm install
npm run build
Setelah instalasi, Breeze menambahkan beberapa file dan folder penting. Perhatikan struktur baru ini:
Instalasi Breeze akan menimpa file routes/web.php kita. Mari kita perbaiki dan pahami alur middleware yang digunakan.
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\UserController;
Route::get('/', function () {
return redirect()->route('dashboard');
});
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::resource('users', UserController::class);
<?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
// ... rute profile lainnya
require __DIR__.'/auth.php';
<?php
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return redirect()->route('dashboard');
});
Route::middleware('auth')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::resource('users', UserController::class);
});
require __DIR__.'/auth.php';
Route::middleware('guest')->group(function () {
// ...
Route::get('login', [AuthenticatedSessionController::class, 'create'])
->name('login');
Route::post('login', [AuthenticatedSessionController::class, 'store']);
// ...
});
Penjelasan middleware('guest'): Ini adalah kebalikan dari auth. Middleware ini memastikan rute di dalamnya hanya bisa diakses oleh tamu (pengguna yang belum login). Jika pengguna yang sudah login mencoba membuka halaman /login, mereka akan otomatis diarahkan ke dashboard.
Di tahap ini, kita akan fokus membuat halaman login terlihat profesional sesuai template admin kita.
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control @error('email') is-invalid @enderror" id="email" name="email" value="{{ old('email') }}" required autofocus>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-4">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control @error('password') is-invalid @enderror" id="password" name="password" required>
@error('password')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="d-flex align-items-center justify-content-between mb-4">
<div class="form-check">
<input class="form-check-input primary" type="checkbox" name="remember" id="remember_me">
<label class="form-check-label text-dark" for="remember_me">
Ingat perangkat ini
</label>
</div>
</div>
<button type="submit" class="btn btn-primary w-100 py-8 fs-4 mb-4 rounded-2">Sign In</button>
</form>
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<script>
@if (session('status'))
swal({
title: 'Berhasil!',
text: '{{ session('status') }}',
icon: 'success',
});
@endif
</script>
</body>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SIMINLAB - Login</title>
<link rel="shortcut icon" type="image/png" href="{{ asset('template-admin/src/assets/images/logos/favicon.png') }}" />
<link rel="stylesheet" href="{{ asset('template-admin/src/assets/css/styles.min.css') }}" />
</head>
<body>
<div class="page-wrapper" id="main-wrapper" data-layout="vertical" data-navbarbg="skin6" data-sidebartype="full"
data-sidebar-position="fixed" data-header-position="fixed">
<div class="position-relative overflow-hidden radial-gradient min-vh-100 d-flex align-items-center justify-content-center">
<div class="d-flex align-items-center justify-content-center w-100">
<div class="row justify-content-center w-100">
<div class="col-md-8 col-lg-6 col-xxl-3">
<div class="card mb-0">
<div class="card-body">
<a href="#" class="text-nowrap logo-img text-center d-block py-3 w-100">
<img src="{{ asset('template-admin/src/assets/images/logos/logo.png') }}" width="180" alt="">
</a>
<p class="text-center">Sistem Inventaris dan Peminjaman Laboratorium</p>
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control @error('email') is-invalid @enderror" id="email" name="email" value="{{ old('email') }}" required autofocus>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-4">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control @error('password') is-invalid @enderror" id="password" name="password" required>
@error('password')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="d-flex align-items-center justify-content-between mb-4">
<div class="form-check">
<input class="form-check-input primary" type="checkbox" name="remember" id="remember_me">
<label class="form-check-label text-dark" for="remember_me">
Ingat perangkat ini
</label>
</div>
</div>
<button type="submit" class="btn btn-primary w-100 py-8 fs-4 mb-4 rounded-2">Sign In</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="{{ asset('template-admin/src/assets/libs/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('template-admin/src/assets/libs/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<script>
@if (session('status'))
swal({
title: 'Berhasil!',
text: '{{ session('status') }}',
icon: 'success',
});
@endif
</script>
</body>
</html>
Mari kita lihat "mesin" yang sudah dibuatkan Breeze untuk kita.
Saatnya menguji sistem keamanan yang baru kita pasang.
Sekarang setelah bisa login, mari kita buat header lebih dinamis.
<a href="javascript:void(0)" class="btn btn-primary">{{ Auth::user()->name }}</a>
<div class="message-body px-3">
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit" class="btn btn-outline-primary w-100 mt-2 d-block">Logout</button>
</form>
</div>
Selamat! Anda telah berhasil mengimplementasikan sistem autentikasi penuh (login dan logout) dan mengintegrasikannya dengan sempurna ke dalam template Anda.
Artikel Lainnya Dengan Kategori Terkait :
1. Inventaris Lab Laravel 12 : Bagian #01 - INSTALASI LARAGON, PHP, PHPMYADMIN & LARAVEL
2. Inventaris Lab Laravel 12 : Bagian #02 - KONFIGURASI DATABASE & FONDASI PROYEK
3. Inventaris Lab Laravel 12 : Bagian #03 - MEMBANGUN HALAMAN ADMIN DENGAN BLADE TEMPLATING
4. Inventaris Lab Laravel 12 : Bagian #04 - MEMBUAT HALAMAN DASHBOARD DINAMIS
5. Inventaris Lab Laravel 12 : Bagian #05 - MEMBUAT HALAMAN CRUD USERS
6. Inventaris Lab Laravel 12 : Bagian #06 - MEMBUAT FITUR AUTENTIKASI (LOGIN) & PENYESUAIAN UI
7. Inventaris Lab Laravel 12 : Bagian #07 - MEMBUAT HALAMAN CRUD CATEGORY
8. Inventaris Lab Laravel 12 : Bagian #08 - MEMBUAT HALAMAN CRUD ITEM
9. Inventaris Lab Laravel 12 : Bagian #09 - MEMBUAT HALAMAN TRANSAKSI PEMINJAMAN (LOAN)
10. Inventaris Lab Laravel 12 : Bagian #10 - HAK AKSES (AUTHORIZATION) & HALAMAN SISWA
Mahardika Oktadiansyah - 15 Juli 2025
Belajar CSS Lanjutan #395 | CSS padding-inline Property
Mahardika Oktadiansyah - 15 Juli 2025
Belajar CSS Lanjutan #394 | CSS padding-bottom Property
Mahardika Oktadiansyah - 15 Juli 2025
Belajar CSS Lanjutan #393 | CSS padding-block-start Property