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();
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.
*/
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()->regenerateToken();
return redirect('/');
}
}
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

View File

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

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.
*/
public function authorize(): bool
public function authorize(): bool
{
return true;
}
@ -39,7 +39,14 @@ public function authenticate(): void
$userArray = collect($allSiswa)->firstWhere('nisn', $inputNisn);
if ($userArray && $userArray['password'] === $inputPassword) {
// Simpan ke session
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());
return;
}
@ -73,6 +80,6 @@ public function ensureIsNotRateLimited(): void
*/
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,
]);
$middleware->alias([
'session.auth' => \App\Http\Middleware\SessionAuthMiddleware::class,
'role' => \App\Http\Middleware\CheckRole::class,
]);
})

View File

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

View File

@ -1,6 +1,6 @@
<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">
<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;">
<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">
@if (Auth::user()->role == 'penjaga perpus')
@if (session('user_data.role') == 'penjaga perpus')
{{-- Menu untuk Penjaga Perpus --}}
<li class="nav-item">
<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>
</a>
</li>
@ -95,4 +95,4 @@ class="nav-link {{ request()->routeIs('baca.*') ? 'active' : '' }}">
</li>
@endif
</ul>
</aside>
</aside>

View File

@ -7,7 +7,6 @@
use App\Http\Controllers\BacaOnlineController;
use App\Http\Controllers\RiwayatController;
use App\Http\Controllers\ProfileController;
// Import Controller Admin
use App\Http\Controllers\Admin\DashboardController as AdminDashboardController;
use App\Http\Controllers\Admin\BookController as AdminBookController;
use App\Http\Controllers\Admin\PengumumanController;
@ -17,8 +16,8 @@
return view('welcome');
});
// --- RUTE UNTUK PENGGUNA TERAUTENTIKASI (SISWA & PENJAGA) ---
Route::middleware(['auth'])->group(function () {
// --- RUTE UNTUK PENGGUNA TERAUTENTIKASI (SISWA & PENJAGA PERPUS) ---
Route::middleware(['session.auth'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('/katalog', [KatalogController::class, 'index'])->name('katalog.index');
@ -52,12 +51,12 @@
});
// --- 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('/buku', [AdminBookController::class, 'index'])->name('buku.index');
Route::get('/buku/tambah', [AdminBookController::class, 'create'])->name('buku.create');
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';