refactor: admin route, fix error chart dashboard admin

This commit is contained in:
zhadaarsita 2025-10-05 11:54:28 +07:00
parent 6455f0cc06
commit efad6eb423
8 changed files with 72 additions and 37 deletions

View File

@ -28,20 +28,30 @@ public function store(LoginRequest $request): RedirectResponse
$request->session()->regenerate(); $request->session()->regenerate();
return redirect()->intended(route('dashboard', absolute: false)); // Ambil data user dari session
$userData = session('user_data');
// Cek role dan redirect sesuai role
if ($userData && isset($userData['role']) && $userData['role'] === 'penjaga perpus') {
return redirect()->route('admin.dashboard');
}
// Default redirect ke dashboard siswa
return redirect()->route('dashboard');
} }
/** /**
* Destroy an authenticated session. * Destroy an authenticated session.
*/ */
public function destroy(Request $request): RedirectResponse public function destroy(Request $request): RedirectResponse
{ {
Auth::guard('web')->logout(); Auth::guard('web')->logout();
$request->session()->forget('user_data'); $request->session()->forget('user_data');
$request->session()->invalidate(); $request->session()->invalidate();
$request->session()->regenerateToken(); $request->session()->regenerateToken();
return redirect('/'); return redirect('/');
} }
} }

View File

@ -4,32 +4,27 @@
use Closure; use Closure;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
class CheckRole class CheckRole
{ {
/** /**
* Handle an incoming request. * Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/ */
public function handle(Request $request, Closure $next, ...$roles): Response public function handle(Request $request, Closure $next, string $role): Response
{ {
if (!Auth::check()) { $userData = session('user_data');
return redirect('login');
// Cek apakah user sudah login
if (!$userData) {
return redirect()->route('login');
} }
$user = Auth::user(); // Cek apakah role sesuai
if (!isset($userData['role']) || $userData['role'] !== $role) {
abort(403, 'Akses ditolak. Anda tidak memiliki izin untuk mengakses halaman ini.');
}
// Loop melalui role yang diizinkan (misal: 'guru', 'admin')
foreach ($roles as $role) {
if ($user->role == $role) {
return $next($request); return $next($request);
} }
}
// Jika role tidak cocok, tolak akses
abort(403, 'AKSES DITOLAK: Anda tidak memiliki hak untuk mengakses halaman ini.');
}
} }

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class SessionAuthMiddleware
{
/**
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next): Response
{
// Cek apakah user_data ada di session
if (!session()->has('user_data')) {
return redirect()->route('login');
}
return $next($request);
}
}

View File

@ -15,7 +15,7 @@ class LoginRequest extends FormRequest
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
*/ */
public function authorize(): bool public function authorize(): bool
{ {
return true; return true;
} }
@ -39,7 +39,14 @@ public function authenticate(): void
$userArray = collect($allSiswa)->firstWhere('nisn', $inputNisn); $userArray = collect($allSiswa)->firstWhere('nisn', $inputNisn);
if ($userArray && $userArray['password'] === $inputPassword) { if ($userArray && $userArray['password'] === $inputPassword) {
// Simpan ke session
session(['user_data' => $userArray]); session(['user_data' => $userArray]);
// Set redirect intention berdasarkan role
if (isset($userArray['role']) && $userArray['role'] === 'penjaga perpus') {
session()->put('url.intended', route('admin.dashboard'));
}
RateLimiter::clear($this->throttleKey()); RateLimiter::clear($this->throttleKey());
return; return;
} }
@ -73,6 +80,6 @@ public function ensureIsNotRateLimited(): void
*/ */
public function throttleKey(): string public function throttleKey(): string
{ {
return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip()); return Str::transliterate(Str::lower($this->string('nisn')).'|'.$this->ip());
} }
} }

View File

@ -15,6 +15,7 @@
\App\Http\Middleware\AuthenticateFromSessionData::class, \App\Http\Middleware\AuthenticateFromSessionData::class,
]); ]);
$middleware->alias([ $middleware->alias([
'session.auth' => \App\Http\Middleware\SessionAuthMiddleware::class,
'role' => \App\Http\Middleware\CheckRole::class, 'role' => \App\Http\Middleware\CheckRole::class,
]); ]);
}) })

View File

@ -124,7 +124,7 @@
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script> <script>
// Script untuk menginisialisasi chart di dashboard admin // Script untuk menginisialisasi chart di dashboard admin
document.addEventListener('turbo:load', function() { document.addEventListener('DOMContentLoaded', function() {
if (window.myBarChart) window.myBarChart.destroy(); if (window.myBarChart) window.myBarChart.destroy();
if (window.myDonutChart) window.myDonutChart.destroy(); if (window.myDonutChart) window.myDonutChart.destroy();

View File

@ -1,6 +1,6 @@
<aside id="sidebar" class="sidebar bg-white"> <aside id="sidebar" class="sidebar bg-white">
<div class="sidebar-header d-flex justify-content-between align-items-center px-3 py-3 py-md-2"> <div class="sidebar-header d-flex justify-content-between align-items-center px-3 py-3 py-md-2">
<a href="{{ Auth::user()->role == 'penjaga perpus' ? route('admin.dashboard') : route('dashboard') }}" <a href="{{ session('user_data.role') == 'penjaga perpus' ? route('admin.dashboard') : route('dashboard') }}"
class="d-flex align-items-center text-decoration-none" style="gap: 0.75rem;"> class="d-flex align-items-center text-decoration-none" style="gap: 0.75rem;">
<img src="{{ asset('images/logo/icon.svg') }}" alt="Ikon Perpus" style="height: 32px;" class="mt-md-2"> <img src="{{ asset('images/logo/icon.svg') }}" alt="Ikon Perpus" style="height: 32px;" class="mt-md-2">
@ -17,11 +17,11 @@ class="sidebar-title">
<ul class="nav flex-column px-2 mt-2"> <ul class="nav flex-column px-2 mt-2">
@if (Auth::user()->role == 'penjaga perpus') @if (session('user_data.role') == 'penjaga perpus')
{{-- Menu untuk Penjaga Perpus --}} {{-- Menu untuk Penjaga Perpus --}}
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('admin.dashboard') }}" <a href="{{ route('admin.dashboard') }}"
class="nav-link {{ request()->routeIs('admin.dashboard.*') ? 'active' : '' }}"> class="nav-link {{ request()->routeIs('admin.dashboard') ? 'active' : '' }}">
<i class="bi bi-grid-1x2-fill"></i><span class="nav-text ms-2">Dashboard</span> <i class="bi bi-grid-1x2-fill"></i><span class="nav-text ms-2">Dashboard</span>
</a> </a>
</li> </li>

View File

@ -7,7 +7,6 @@
use App\Http\Controllers\BacaOnlineController; use App\Http\Controllers\BacaOnlineController;
use App\Http\Controllers\RiwayatController; use App\Http\Controllers\RiwayatController;
use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProfileController;
// Import Controller Admin
use App\Http\Controllers\Admin\DashboardController as AdminDashboardController; use App\Http\Controllers\Admin\DashboardController as AdminDashboardController;
use App\Http\Controllers\Admin\BookController as AdminBookController; use App\Http\Controllers\Admin\BookController as AdminBookController;
use App\Http\Controllers\Admin\PengumumanController; use App\Http\Controllers\Admin\PengumumanController;
@ -17,8 +16,8 @@
return view('welcome'); return view('welcome');
}); });
// --- RUTE UNTUK PENGGUNA TERAUTENTIKASI (SISWA & PENJAGA) --- // --- RUTE UNTUK PENGGUNA TERAUTENTIKASI (SISWA & PENJAGA PERPUS) ---
Route::middleware(['auth'])->group(function () { Route::middleware(['session.auth'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('/katalog', [KatalogController::class, 'index'])->name('katalog.index'); Route::get('/katalog', [KatalogController::class, 'index'])->name('katalog.index');
@ -52,12 +51,12 @@
}); });
// --- GRUP RUTE KHUSUS UNTUK ADMIN / PENJAGA PERPUSTAKAAN --- // --- GRUP RUTE KHUSUS UNTUK ADMIN / PENJAGA PERPUSTAKAAN ---
Route::middleware(['auth', 'role:penjaga perpus'])->prefix('admin')->name('admin.')->group(function () { Route::middleware(['session.auth', 'role:penjaga perpus'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [AdminDashboardController::class, 'index'])->name('dashboard'); Route::get('/dashboard', [AdminDashboardController::class, 'index'])->name('dashboard');
Route::get('/buku', [AdminBookController::class, 'index'])->name('buku.index'); Route::get('/buku', [AdminBookController::class, 'index'])->name('buku.index');
Route::get('/buku/tambah', [AdminBookController::class, 'create'])->name('buku.create'); Route::get('/buku/tambah', [AdminBookController::class, 'create'])->name('buku.create');
Route::get('/pengguna', [AdminUserController::class, 'index'])->name('pengguna.index'); Route::get('/pengguna', [AdminUserController::class, 'index'])->name('pengguna.index');
Route::get('/pengumuman', [PengumumanController::class, 'index'])->name('pengumuman.index'); // <-- RUTE BARU Route::get('/pengumuman', [PengumumanController::class, 'index'])->name('pengumuman.index');
}); });
require __DIR__ . '/auth.php'; require __DIR__ . '/auth.php';