Inventaris Lab Laravel 12 : Bagian #10 - HAK AKSES (AUTHORIZATION) & HALAMAN SISWA
Belajar Bareng Minarsih - Edisi Ngoding
10 Oktober 2025
Tujuan: Saat ini, jika seorang siswa login, ia masih bisa melihat menu-menu admin. Ini tentu tidak ideal. Di bagian terakhir ini, kita akan membangun sistem hak akses (Authorization) yang sesungguhnya. Tujuannya adalah:
Middleware di Laravel bertindak seperti satpam yang berdiri di depan sebuah pintu (rute). Kita akan membuat satpam yang hanya mengizinkan pengguna dengan peran 'Admin' untuk masuk.
php artisan make:middleware AdminMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class AdminMiddleware
{
/**
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next): Response
{
// Cek apakah pengguna sudah login Dan memiliki peran 'Admin'
if (Auth::check() && Auth::user()->role == 'Admin') {
// Jika ya, izinkan untuk melanjutkan ke halaman tujuan
return $next($request);
}
// Jika tidak, paksa logout dan arahkan ke halaman login dengan pesan error
Auth::logout();
return redirect()->route('login')->withErrors(['email' => 'Anda tidak memiliki hak akses untuk halaman ini.']);
}
}
Sekarang kita perlu menempatkan "satpam" (AdminMiddleware) ini di depan semua "pintu" (rute) halaman admin.
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => \App\Http\Middleware\AdminMiddleware::class,
]);
})
Route::middleware('auth')->group(function () {
// Rute untuk siswa (ditaruh di luar grup admin)
// (Akan kita buat di langkah selanjutnya)
// Grup baru ini khusus untuk admin
Route::middleware('admin')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::resource('users', UserController::class);
Route::resource('category', CategoryController::class);
Route::resource('item', ItemController::class);
Route::resource('loan', LoanController::class);
Route::put('loan/{loan}/return', [LoanController::class, 'returnItem'])->name('loan.return');
});
});
Kita akan membuat "rumah" bagi siswa setelah mereka login, yaitu halaman profil yang berisi riwayat peminjaman mereka.
Route::middleware('auth')->group(function () {
// Rute baru untuk profil siswa, ditaruh di sini
Route::get('/profil', [DashboardController::class, 'profile'])->name('profile');
// Grup rute khusus untuk admin...
Route::middleware('admin')->group(function () {
// ...
});
});
// Tambahkan use statement untuk Auth dan Loan di atas kelas controller
use Illuminate\Support\Facades\Auth;
use App\Models\Loan;
// ...
public function profile()
{
$data['title'] = 'Profil Saya';
$data['menu'] = 'profile';
// Ambil data peminjaman HANYA untuk user yang sedang login
$data['loans'] = Loan::where('user_id', Auth::id())->with('item')->latest()->get();
return view('student.profile', $data);
}
@extends('admin.layouts.app')
@section('css')
{{-- CSS Tambahan --}}
@endsection
@section('content')
<div class="card">
<div class="card-body">
<h5 class="card-title fw-semibold mb-4">Selamat Datang, {{ Auth::user()->name }}!</h5>
<p class="mb-3">Berikut adalah riwayat peminjaman barang Anda.</p>
<div class="table-responsive">
<table id="datatable" class="table table-striped">
<thead>
<tr>
<th>No</th>
<th>Nama Barang</th>
<th>Tgl Pinjam</th>
<th>Tgl Wajib Kembali</th>
<th>Tgl Aktual Kembali</th>
<th>Status</th>
</tr>
</thead>
<tbody>
@foreach ($loans as $loan)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $loan->item->name }}</td>
<td>{{ \Carbon\Carbon::parse($loan->loan_date)->format('d-m-Y') }}</td>
<td>{{ \Carbon\Carbon::parse($loan->return_date)->format('d-m-Y') }}</td>
<td>
@if ($loan->actual_return_date)
{{ \Carbon\Carbon::parse($loan->actual_return_date)->format('d-m-Y') }}
@else
-
@endif
</td>
<td>
@if ($loan->status == 'Dipinjam')
<span class="badge bg-warning">{{ $loan->status }}</span>
@else
<span class="badge bg-success">{{ $loan->status }}</span>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
@endsection
@section('js')
<script>
$(document).ready(function() {
$('#datatable').DataTable();
});
</script>
@endsection
Langkah selanjutnya adalah "mengajari" sistem login kita untuk membedakan antara Admin dan Siswa.
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
// TAMBAHAN: Cek peran pengguna
if (Auth::user()->role === 'Admin') {
// Arahkan admin ke dashboard
return redirect()->intended(route('dashboard', absolute: false));
}
// Jika bukan admin, arahkan ke rute profil
return redirect()->route('profile');
}
Ini adalah sentuhan akhir. Kita akan membuat sidebar menampilkan menu yang berbeda untuk Admin dan Siswa.
<ul id="sidebarnav">
{{-- TAMPILAN MENU UNTUK ADMIN --}}
@if (Auth::user()->role == 'Admin')
<li class="nav-small-cap">
<i class="ti ti-dots nav-small-cap-icon fs-4"></i>
<span class="hide-menu">Home</span>
</li>
<li class="sidebar-item {{ Request::is('dashboard') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('dashboard') ? 'active' : '' }}"
href="{{ route('dashboard') }}" aria-expanded="false">
<span><i class="ti ti-layout-dashboard"></i></span>
<span class="hide-menu">Dashboard</span>
</a>
</li>
<li class="nav-small-cap">
<i class="ti ti-dots nav-small-cap-icon fs-4"></i>
<span class="hide-menu">Datamaster</span>
</li>
<li class="sidebar-item {{ Request::is('users*') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('users*') ? 'active' : '' }}"
href="{{ route('users.index') }}" aria-expanded="false">
<span><i class="ti ti-users"></i></span>
<span class="hide-menu">Data Users</span>
</a>
</li>
<li class="sidebar-item {{ Request::is('category*') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('category*') ? 'active' : '' }}"
href="{{ route('category.index') }}" aria-expanded="false">
<span><i class="ti ti-category"></i></span>
<span class="hide-menu">Data Category</span>
</a>
</li>
<li class="sidebar-item {{ Request::is('item*') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('item*') ? 'active' : '' }}"
href="{{ route('item.index') }}" aria-expanded="false">
<span><i class="ti ti-box"></i></span>
<span class="hide-menu">Data Item</span>
</a>
</li>
<li class="nav-small-cap">
<i class="ti ti-dots nav-small-cap-icon fs-4"></i>
<span class="hide-menu">Transaksi</span>
</li>
<li class="sidebar-item {{ Request::is('loan*') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('loan*') ? 'active' : '' }}"
href="{{ route('loan.index') }}" aria-expanded="false">
<span><i class="ti ti-clipboard-text"></i></span>
<span class="hide-menu">Peminjaman</span>
</a>
</li>
{{-- TAMPILAN MENU UNTUK SISWA --}}
@elseif (Auth::user()->role == 'Siswa')
<li class="nav-small-cap">
<i class="ti ti-dots nav-small-cap-icon fs-4"></i>
<span class="hide-menu">Home</span>
</li>
<li class="sidebar-item {{ Request::is('profil') ? 'selected' : '' }}">
<a class="sidebar-link {{ Request::is('profil') ? 'active' : '' }}" href="{{ route('profile') }}" aria-expanded="false">
<span><i class="ti ti-user-circle"></i></span>
<span class="hide-menu">Profil Saya</span>
</a>
</li>
@endif
</ul>
Saatnya menguji sistem hak akses kita secara penuh. Pastikan Anda sudah logout.
SELAMAT! 🎉
Anda telah berhasil membangun sebuah aplikasi web Sistem Informasi sederhana dari nol hingga selesai, lengkap dengan CRUD, sistem autentikasi, dan hak akses berdasarkan peran pengguna yang profesional. Ini adalah fondasi yang sangat kuat untuk melanjutkan perjalanan Anda sebagai seorang Web Developer dengan framework Laravel.
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