# Proteksi Akses Admin-Only untuk Pengaturan Sekolah

## Ringkasan
Implementasi proteksi akses agar halaman "Pengaturan Sekolah" hanya bisa diakses oleh user dengan role **admin**. User dengan role lain (wali_kelas, kepala_perpustakaan, dll) tidak dapat mengakses halaman ini dan menu tidak ditampilkan di profil mereka.

## Perubahan yang Diimplementasikan

### 1. **ProfilSekolahController** - Proteksi di Level Controller

Menambahkan pengecekan role di setiap method:

#### Method `index()` - Melihat Pengaturan
```php
public function index()
{
    // Only admin can access
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses. Hanya admin yang dapat melihat pengaturan sekolah.');
    }
    
    $pengaturan = Pengaturan::getSetting();
    return view('simaju.profil-sekolah.index', compact('pengaturan'));
}
```

#### Method `edit()` - Form Edit Pengaturan
```php
public function edit()
{
    // Only admin can access
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses. Hanya admin yang dapat mengedit pengaturan sekolah.');
    }
    
    $pengaturan = Pengaturan::getSetting();
    return view('simaju.profil-sekolah.edit', compact('pengaturan'));
}
```

#### Method `update()` - Update Pengaturan
```php
public function update(Request $request)
{
    // Only admin can access
    if (auth()->user()->role !== 'admin') {
        return redirect()->route('simaju.dashboard')
            ->with('error', 'Anda tidak memiliki akses. Hanya admin yang dapat mengupdate pengaturan sekolah.');
    }
    
    // ... validation and update logic
}
```

#### Method `deleteLogo()` - Delete Logo
```php
public function deleteLogo(Request $request, $type)
{
    // Only admin can access
    if (auth()->user()->role !== 'admin') {
        return response()->json(['success' => false, 'message' => 'Akses ditolak'], 403);
    }
    
    // ... delete logo logic
}
```

### 2. **Profile View** - Sembunyikan Menu dari Sidebar

File: `resources/views/simaju/settings/profile.blade.php`

#### Sebelum (Menu Terlihat untuk Semua):
```blade
<a href="{{ route('simaju.settings.change-password') }}"
   class="flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors group">
    <!-- Ganti Password -->
</a>

<a href="{{ route('simaju.settings.index') }}"
   class="flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors group">
    <!-- Pengaturan Sekolah -->
</a>

<form action="{{ route('logout') }}" method="POST">
    <!-- Logout -->
</form>
```

#### Sesudah (Menu Hanya untuk Admin):
```blade
<a href="{{ route('simaju.settings.change-password') }}"
   class="flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors group">
    <!-- Ganti Password -->
</a>

@if(auth()->user()->role === 'admin')
<a href="{{ route('simaju.settings.index') }}"
   class="flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors group">
    <!-- Pengaturan Sekolah -->
</a>
@endif

<form action="{{ route('logout') }}" method="POST">
    <!-- Logout -->
</form>
```

## Cara Kerja Proteksi

### 1. **Proteksi di Controller (Backend)**
- Setiap method mengecek `auth()->user()->role`
- Jika bukan 'admin', user di-redirect ke dashboard dengan pesan error
- Untuk API/AJAX request (deleteLogo), mengembalikan JSON response 403

### 2. **Proteksi di View (Frontend)**
- Menu "Pengaturan Sekolah" dibungkus dengan `@if(auth()->user()->role === 'admin')`
- Jika user bukan admin, menu tidak ditampilkan sama sekali
- User tetap bisa melihat menu "Ganti Password" dan "Logout"

## File yang Dimodifikasi

| File | Lokasi | Perubahan |
|------|--------|-----------|
| **ProfilSekolahController** | `app/Http/Controllers/Simaju/ProfilSekolahController.php` | Tambah proteksi di 4 methods |
| **Profile View** | `resources/views/simaju/settings/profile.blade.php` | Wrap menu dengan @if admin |

## Testing

### Test Akses Admin ✅
1. Login sebagai admin
2. Buka halaman "Profil Saya"
3. **Hasil**: Menu "Pengaturan Sekolah" **terlihat**
4. Klik menu "Pengaturan Sekolah"
5. **Hasil**: Berhasil masuk ke halaman pengaturan

### Test Akses Guru ❌
1. Login sebagai guru (wali_kelas)
2. Buka halaman "Profil Saya"
3. **Hasil**: Menu "Pengaturan Sekolah" **tidak terlihat**
4. Jika manual akses URL: `http://domain/simaju/profil-sekolah`
5. **Hasil**: Di-redirect ke dashboard dengan error message

### Test Edit Pengaturan
1. Login sebagai admin
2. Akses halaman pengaturan sekolah
3. Klik "Edit Profil"
4. **Hasil**: Berhasil membuka form edit ✅

5. Login sebagai guru
6. Manual akses: `http://domain/simaju/profil-sekolah/edit`
7. **Hasil**: Di-redirect ke dashboard ❌

### Test Update Pengaturan
1. Login sebagai admin
2. Edit dan submit form pengaturan
3. **Hasil**: Berhasil update ✅

4. Login sebagai guru
5. Manual submit form (via postman/curl)
6. **Hasil**: Di-redirect dengan error ❌

## Pesan Error

Saat user non-admin mencoba mengakses:

```
❌ Anda tidak memiliki akses. Hanya admin yang dapat melihat pengaturan sekolah.
❌ Anda tidak memiliki akses. Hanya admin yang dapat mengedit pengaturan sekolah.
❌ Anda tidak memiliki akses. Hanya admin yang dapat mengupdate pengaturan sekolah.
```

Untuk AJAX/API request:
```json
{
    "success": false,
    "message": "Akses ditolak"
}
```

## Routes yang Dilindungi

Semua route pengaturan sekolah dilindungi:

```php
// View pengaturan
Route::get('/profil-sekolah', [ProfilSekolahController::class, 'index'])
    ->name('simaju.profil-sekolah.index');

// Form edit
Route::get('/profil-sekolah/edit', [ProfilSekolahController::class, 'edit'])
    ->name('simaju.profil-sekolah.edit');

// Update pengaturan
Route::put('/profil-sekolah', [ProfilSekolahController::class, 'update'])
    ->name('simaju.profil-sekolah.update');

// Delete logo
Route::delete('/profil-sekolah/delete-logo/{type}', [ProfilSekolahController::class, 'deleteLogo'])
    ->name('simaju.profil-sekolah.delete-logo');
```

## Keamanan

### 1. **Double Protection**
- **Frontend**: Menu disembunyikan dari UI
- **Backend**: Controller mengecek role sebelum execute

### 2. **Session-Based Authentication**
- Menggunakan `auth()->user()` untuk mendapatkan user saat ini
- Role disimpan di session setelah login

### 3. **Redirect Safe**
- User di-redirect ke dashboard, bukan halaman error
- Pesan error informatif tapi tidak expose sistem

### 4. **API Security**
- AJAX/API request mengembalikan HTTP 403 (Forbidden)
- JSON response untuk client-side handling

## Role yang Diizinkan

| Role | Akses Pengaturan Sekolah |
|------|--------------------------|
| **admin** | ✅ Full Access |
| wali_kelas | ❌ No Access |
| kepala_perpustakaan | ❌ No Access |
| Role lainnya | ❌ No Access |

## Pengecualian

Menu yang **tetap terlihat** untuk semua role:
- ✅ **Ganti Password** - Semua user bisa ganti password sendiri
- ✅ **Logout** - Semua user bisa logout

## Best Practices

### 1. **Gunakan Guard di Middleware (Optional)**
Untuk proteksi lebih ketat, bisa tambahkan middleware:

```php
// routes/web.php
Route::middleware(['auth', 'role:admin'])->group(function () {
    Route::get('/profil-sekolah', [ProfilSekolahController::class, 'index']);
    // ... other admin routes
});
```

### 2. **Logging Access Attempts**
Untuk audit trail, bisa tambahkan logging:

```php
if (auth()->user()->role !== 'admin') {
    \Log::warning('Unauthorized access attempt to school settings', [
        'user_id' => auth()->id(),
        'user_role' => auth()->user()->role,
        'ip' => request()->ip(),
    ]);
    
    return redirect()->route('simaju.dashboard')
        ->with('error', 'Anda tidak memiliki akses.');
}
```

### 3. **Gate Authorization (Laravel)**
Bisa menggunakan Laravel Gate untuk authorization lebih clean:

```php
// app/Providers/AuthServiceProvider.php
Gate::define('manage-school-settings', function ($user) {
    return $user->role === 'admin';
});

// Controller
if (Gate::denies('manage-school-settings')) {
    abort(403);
}
```

## Troubleshooting

### Menu Masih Terlihat untuk Guru
**Penyebab**: Cache view belum clear
**Solusi**:
```bash
php artisan view:clear
php artisan cache:clear
```

### User Non-Admin Bisa Akses via URL
**Penyebab**: Proteksi controller belum aktif
**Solusi**: Pastikan semua method di controller sudah ada pengecekan role

### Error "Undefined property: role"
**Penyebab**: User tidak memiliki property role
**Solusi**: Pastikan field `role` ada di tabel `users`

---

**Tanggal Implementasi**: 6 Agustus 2026
**Developer**: AI Assistant
**Status**: ✅ Completed & Tested
**Security Level**: 🔒 High (Double Protection: Frontend + Backend)
