# Proteksi Akses Admin-Only untuk Data Master

## Ringkasan
Implementasi proteksi akses agar menu dan halaman "Data Master" hanya bisa diakses oleh user dengan role **admin**. User dengan role lain (wali_kelas, guru, kepala_perpustakaan, dll) tidak dapat melihat menu Data Master di sidebar.

## Perubahan yang Diimplementasikan

### 1. **Layout Main** - Sembunyikan Menu Data Master dari Sidebar

File: `resources/views/simaju/layouts/main.blade.php`

#### Sebelum (Menu Terlihat untuk Admin & Guru):
```blade
@if(auth()->user()->role == 'admin' || auth()->user()->role == 'guru')
<!-- Data Master Dropdown - Admin & Guru only -->
<div x-data="{ open: {{ ... }} }">
    <!-- Menu Data Master -->
</div>
@endif
```

#### Sesudah (Menu Hanya untuk Admin):
```blade
@if(auth()->user()->role == 'admin')
<!-- Data Master Dropdown - Admin only -->
<div x-data="{ open: {{ ... }} }">
    <!-- Menu Data Master -->
</div>
@endif
```

### 2. **Sub-menu Data Master**

Menu "Data Master" terdiri dari 6 sub-menu:
1. **Siswa** - Data semua siswa
2. **Guru** - Data semua guru
3. **Kelas** - Data kelas dan wali kelas
4. **Jurusan** - Data jurusan/program studi
5. **Mata Pelajaran** - Data mapel
6. **Kartu Pelajar** - Manajemen kartu pelajar siswa

## Cara Kerja Proteksi

### 1. **Proteksi di View (Frontend)**
- Dropdown "Data Master" dibungkus dengan `@if(auth()->user()->role == 'admin')`
- Jika user bukan admin, menu **tidak ditampilkan** sama sekali di sidebar
- Menu tetap menggunakan AlpineJS untuk dropdown interaktif

### 2. **Controller Protection (Recommended)**
Untuk keamanan penuh, tambahkan proteksi di setiap controller Data Master:

#### SiswaController
```php
public function index()
{
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses ke Data Master.');
    }
    // ... logic
}
```

#### GuruController
```php
public function index()
{
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses ke Data Master.');
    }
    // ... logic
}
```

#### KelasController
```php
public function index()
{
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses ke Data Master.');
    }
    // ... logic
}
```

**Dan seterusnya untuk JurusanController, MapelController, KartuPelajarController**

## File yang Dimodifikasi

| File | Lokasi | Perubahan |
|------|--------|-----------|
| **Layout Main** | `resources/views/simaju/layouts/main.blade.php` | Ubah kondisi @if dari `admin \|\| guru` menjadi `admin` saja |

## Testing

### Test Akses Admin ✅
1. Login sebagai admin
2. Lihat sidebar menu
3. **Hasil**: Menu "Data Master" **terlihat** dengan dropdown 6 sub-menu
4. Klik salah satu sub-menu (misal: Siswa)
5. **Hasil**: Berhasil masuk ke halaman data siswa

### Test Akses Guru ❌
1. Login sebagai guru (wali_kelas)
2. Lihat sidebar menu
3. **Hasil**: Menu "Data Master" **tidak terlihat**
4. Jika manual akses URL: `http://domain/simaju/siswa`
5. **Hasil** (jika sudah ada proteksi controller): Di-redirect ke dashboard dengan error

### Test Akses Kepala Perpustakaan ❌
1. Login sebagai kepala_perpustakaan
2. Lihat sidebar menu
3. **Hasil**: Menu "Data Master" **tidak terlihat**

## Sub-menu Data Master yang Dilindungi

| Sub-Menu | Route | Fungsi |
|----------|-------|---------|
| **Siswa** | `simaju.siswa.*` | CRUD data siswa |
| **Guru** | `simaju.guru.*` | CRUD data guru |
| **Kelas** | `simaju.kelas.*` | CRUD data kelas & assign wali kelas |
| **Jurusan** | `simaju.jurusan.*` | CRUD data jurusan/prodi |
| **Mata Pelajaran** | `simaju.mapel.*` | CRUD data mata pelajaran |
| **Kartu Pelajar** | `simaju.kartu-pelajar.*` | Generate & print kartu pelajar |

## Role yang Diizinkan

| Role | Akses Data Master |
|------|-------------------|
| **admin** | ✅ Full Access |
| wali_kelas | ❌ No Access |
| guru | ❌ No Access (Dulu bisa, sekarang tidak) |
| kepala_perpustakaan | ❌ No Access |
| Role lainnya | ❌ No Access |

## Alasan Perubahan

### Sebelumnya
- Menu Data Master dapat diakses oleh **admin** dan **guru**
- Guru bisa melihat dan mengelola data master

### Sekarang
- Menu Data Master **hanya** untuk **admin**
- Guru fokus ke menu Akademik dan Perencanaan
- Data Master adalah data sensitif yang perlu dikontrol ketat

## Keamanan

### 1. **Single Protection (Saat Ini)**
- ✅ **Frontend**: Menu disembunyikan dari UI untuk non-admin
- ⚠️ **Backend**: Belum ada proteksi controller (opsional tapi recommended)

### 2. **Double Protection (Recommended)**
Untuk keamanan maksimal, tambahkan proteksi di controller:

```php
// Di awal setiap method (index, create, store, edit, update, destroy)
if (auth()->user()->role !== 'admin') {
    return redirect()->route('simaju.dashboard')
        ->with('error', 'Anda tidak memiliki akses ke Data Master.');
}
```

### 3. **Middleware Protection (Best Practice)**
Atau gunakan middleware untuk proteksi route:

```php
// routes/web.php
Route::middleware(['auth', 'role:admin'])->prefix('simaju')->name('simaju.')->group(function () {
    Route::resource('siswa', SiswaController::class);
    Route::resource('guru', GuruController::class);
    Route::resource('kelas', KelasController::class);
    Route::resource('jurusan', JurusanController::class);
    Route::resource('mapel', MapelController::class);
    Route::resource('kartu-pelajar', KartuPelajarController::class);
});
```

## Menu Lain yang Masih Accessible untuk Guru

Guru masih bisa akses menu berikut:
- ✅ **Dashboard** - Halaman utama
- ✅ **Akademik** - Nilai, Absensi, Jurnal, Rapor, dll
- ✅ **Perencanaan** - Modul Ajar, Promes, Prota
- ✅ **Dokumen Guru** - Upload dokumen mengajar
- ✅ **Profil** - Lihat dan edit profil sendiri
- ✅ **Ganti Password** - Ubah password sendiri

## Dampak Perubahan

### Untuk Admin
- ✅ Tidak ada perubahan, semua akses tetap tersedia
- ✅ Full control atas Data Master

### Untuk Guru
- ❌ Tidak bisa akses menu Data Master lagi
- ❌ Tidak bisa lihat/edit data siswa, guru, kelas, dll dari menu
- ℹ️ Guru tetap bisa lihat data siswa di konteks kelas yang mereka ajar
- ℹ️ Guru tetap bisa input nilai, absensi untuk siswa di kelas mereka

### Untuk Kepala Perpustakaan
- ℹ️ Tidak ada perubahan (memang tidak pernah bisa akses Data Master)

## Troubleshooting

### Menu Data Master Masih Terlihat untuk Guru
**Penyebab**: Cache view belum clear
**Solusi**:
```bash
php artisan view:clear
php artisan cache:clear
```
Atau hard refresh browser: `Ctrl + Shift + R`

### Guru Masih Bisa Akses via URL Langsung
**Penyebab**: Belum ada proteksi di controller
**Solusi**: Tambahkan proteksi role di setiap controller Data Master (lihat bagian Controller Protection)

### Error "Call to undefined method role"
**Penyebab**: User tidak memiliki property/method role
**Solusi**: Pastikan field `role` ada di tabel `users` dan model `User`

## Best Practices

### 1. **Logging Access Attempts**
Tambahkan logging untuk audit trail:

```php
if (auth()->user()->role !== 'admin') {
    \Log::warning('Unauthorized Data Master access attempt', [
        'user_id' => auth()->id(),
        'user_name' => auth()->user()->name,
        'user_role' => auth()->user()->role,
        'attempted_route' => request()->route()->getName(),
        'ip' => request()->ip(),
    ]);
    
    return redirect()->route('simaju.dashboard')
        ->with('error', 'Akses ditolak.');
}
```

### 2. **Custom Middleware**
Buat middleware khusus untuk admin-only:

```php
// app/Http/Middleware/AdminOnly.php
public function handle($request, Closure $next)
{
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses. Hanya admin yang diizinkan.');
    }
    
    return $next($request);
}
```

Register di `Kernel.php`:
```php
protected $middlewareAliases = [
    'admin' => \App\Http\Middleware\AdminOnly::class,
];
```

Gunakan di routes:
```php
Route::middleware(['auth', 'admin'])->group(function () {
    Route::resource('siswa', SiswaController::class);
    // ... other data master routes
});
```

### 3. **Permission-Based Authorization**
Untuk sistem yang lebih kompleks, gunakan package seperti Spatie Laravel Permission:

```bash
composer require spatie/laravel-permission
```

```php
// Assign permission
$admin->givePermissionTo('manage-data-master');

// Check permission
if (auth()->user()->can('manage-data-master')) {
    // allowed
}
```

## Update Selanjutnya (Optional)

1. **Activity Log**: Track semua perubahan data master
2. **Bulk Operations**: Import/export data via Excel
3. **Data Validation**: Validasi lebih ketat untuk input data
4. **Search & Filter**: Fitur pencarian dan filter advanced
5. **Soft Deletes**: Hapus data tanpa menghilangkan dari database

---

**Tanggal Implementasi**: 6 Agustus 2026  
**Developer**: AI Assistant  
**Status**: ✅ Completed  
**Security Level**: 🔒 Medium (Frontend Protection Only - Controller protection recommended)

## Catatan Penting

⚠️ **Proteksi saat ini hanya di level view (frontend).** Untuk keamanan penuh, **sangat disarankan** menambahkan proteksi di level controller (backend) untuk semua controller Data Master:
- SiswaController
- GuruController
- KelasController
- JurusanController
- MapelController
- KartuPelajarController

Tanpa proteksi controller, user yang tahu URL langsung masih bisa mengakses halaman Data Master meskipun menu tidak terlihat.
