Inventaris Lab Laravel 12 : Bagian #10 - HAK AKSES (AUTHORIZATION) & HALAMAN SISWA — Minarsih TECH Install Web App

Inventaris Lab Laravel 12 : Bagian #10 - HAK AKSES (AUTHORIZATION) & HALAMAN SISWA

profil-penulis

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:

  1. Memblokir total akses siswa ke semua halaman admin menggunakan Middleware.
  2. Menampilkan menu sidebar yang berbeda untuk Admin dan Siswa.
  3. Mengarahkan siswa ke halaman dasbor khusus milik mereka setelah login.
  4. Menampilkan riwayat peminjaman pribadi untuk setiap siswa.

 

Langkah 1: Membuat "Satpam" Khusus Admin (Middleware)

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.

  1. Buat File Middleware: Buka terminal di VS Code dan jalankan perintah Artisan berikut:
     
    php artisan make:middleware AdminMiddleware


    Perintah ini akan membuat file baru di app/Http/Middleware/AdminMiddleware.php.


     
  2. Isi Logika Middleware:
    • Buka file app/Http/Middleware/AdminMiddleware.php.


       
    • Di dalam fungsi handle(), kita akan menambahkan logika untuk memeriksa peran pengguna. Ganti isinya menjadi seperti ini:
       
      <?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.']);
      
          }
      
      }

 

Langkah 2: Menerapkan "Satpam" ke Rute Admin

Sekarang kita perlu menempatkan "satpam" (AdminMiddleware) ini di depan semua "pintu" (rute) halaman admin.

  1. Daftarkan Middleware:
    • Buka file bootstrap/app.php.


       
    • Di dalam metode withMiddleware(), daftarkan middleware baru kita dengan sebuah alias (nama panggilan).
       
      ->withMiddleware(function (Middleware $middleware) {
          $middleware->alias([
      
              'admin' => \App\Http\Middleware\AdminMiddleware::class,
      
          ]);
      
      })
      

  1. Terapkan pada Grup Rute:
    • Buka file routes/web.php.


       
    • Kita akan membungkus semua rute admin yang ada di dalam grup middleware('auth') dengan satu grup middleware baru, yaitu middleware('admin').
       
      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');
      
          });
      
      });




       

Langkah 3: Membuat Halaman Dasbor Siswa

Kita akan membuat "rumah" bagi siswa setelah mereka login, yaitu halaman profil yang berisi riwayat peminjaman mereka.

  1. Membuat Rute & Logika Controller:
    • Buka file routes/web.php.


       
    • Tambahkan rute /profil di dalam grup middleware('auth'), tetapi di luar grup middleware('admin').
      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 () {
      
              // ...
      
          });
      
      });

  • Selanjutnya, buka app/Http/Controllers/DashboardController.php. Tambahkan use statement dan method baru bernama profile.
     
    // 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);
    
    }

 

  1. Membuat Tampilan (View) Dasbor Siswa:
    • Di dalam resources/views/, buat folder baru bernama student.


       
    • Di dalam folder student, buat file baru bernama profile.blade.php.


       
    • Isi file profile.blade.php dengan kode berikut:
      @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 4: Menyesuaikan Logika Redirect Login

Langkah selanjutnya adalah "mengajari" sistem login kita untuk membedakan antara Admin dan Siswa.

  1. Buka app/Http/Controllers/Auth/AuthenticatedSessionController.php.


     
  2. Pastikan use Illuminate\Support\Facades\Auth; ada di bagian atas file.


     
  3. Modifikasi fungsi store() menjadi seperti ini:
     
    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');
    
    }

 

Langkah 5: Menyesuaikan Tampilan Sidebar Sesuai Peran

Ini adalah sentuhan akhir. Kita akan membuat sidebar menampilkan menu yang berbeda untuk Admin dan Siswa.

  1. Buka file resources/views/admin/layouts/sidebar.blade.php.


     
  2. Ganti seluruh isi dari <ul id="sidebarnav"> dengan logika @if dari Blade seperti di bawah ini.
     
    <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>






     

 

Langkah 6: Uji Coba Menyeluruh

Saatnya menguji sistem hak akses kita secara penuh. Pastikan Anda sudah logout.

  1. Skenario 1 (Login sebagai Admin):
    • Login menggunakan akun admin (admin@smkn2-mjk.sch.id) dengan password admin.


       
    • Hasil: Anda akan diarahkan ke Dashboard Admin. Perhatikan sidebar, semua menu admin (Dashboard, Datamaster, Transaksi) akan tampil.


       
  2. Skenario 2 (Login sebagai Siswa):
    • Logout dari akun admin.


       
    • Login menggunakan akun siswa (siswa@smkn2-mjk.sch.id) dengan password siswa.


       
    • Hasil: Anda akan diarahkan ke halaman /profil. Perhatikan sidebar, sekarang hanya akan ada satu menu, yaitu "Profil Saya".


       
  3. Skenario 3 (Akses Terlarang):
    • Selagi Anda login sebagai siswa, coba akses URL halaman admin secara manual, misalnya: http://127.0.0.1:8000/users.


       
    • Hasil: Anda akan "ditendang" kembali ke halaman login dengan pesan error. Ini membuktikan AdminMiddleware kita bekerja dengan sempurna!

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

Masuk Terlebih dahulu untuk berkomentar

Paling baru
Lihat Lainnya