# Modul 1: Authentication & Role Management

## 1. User Flow
- **Register**: Pengguna mendaftar dengan Name, Email, Password, dan Pilihan Role dasar (Author/Reader). Role yang lebih tinggi harus di-assign oleh Admin/Journal Manager.
- **Login**: Pengguna memasukkan Email & Password. Sistem memverifikasi dengan `password_verify()`. Jika sukses, data session dibuat.
- **Dashboard**: Setelah login, pengguna diredirect ke `/dashboard`. Tampilan dashboard berbeda-beda berdasarkan `$_SESSION['user_role']`.
- **Logout**: Session dihapus (`session_destroy()`) dan kembali ke halaman login.

## 2. Daftar Permission Setiap Role
1. **super_admin**: Akses penuh ke sistem, mengubah semua konfigurasi, manage users.
2. **journal_manager**: Manage pengaturan jurnal, create issue/volume.
3. **editor**: Review awal (desk reject), assign reviewer, keputusan akhir.
4. **reviewer**: Memberikan penilaian terhadap naskah yang di-assign.
5. **author**: Submit naskah, cek status naskah.
6. **reader**: Download/baca naskah yang sudah dipublish (role default tanpa hak cipta backend khusus).

## 3. SQL CREATE TABLE
Sesuai batasan Role yang diminta.

```sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    role ENUM('super_admin', 'journal_manager', 'editor', 'reviewer', 'author', 'reader') DEFAULT 'reader',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

## 4, 5, 6, 7. Kode PHP PDO & MVC
Telah dieksekusi di struktur file:
- `app/routes.php`
- `app/controllers/AuthController.php`
- `app/controllers/DashboardController.php`
- `app/models/UserModel.php`
- `app/views/auth/login.php`
- `app/views/auth/register.php`
- `app/views/dashboard/index.php`

## 8. CSRF Protection
Diimplementasi menggunakan `generate_csrf_token()`, `csrf_field()`, dan `verify_csrf_token()` dari helper `csrf.php`. Digunakan pada saat validasi method `POST` di Controller.

## 9. Password Hashing
Register menggunakan `password_hash($pass, PASSWORD_BCRYPT)`.
Login menggunakan `password_verify($pass, $hash)`.

## 10. Testing Scenario
1. Buka `/register`. Isi form dengan role `author`. Cek DB memastikan password terenkripsi bcrypt dan `role='author'`.
2. Buka `/login`. Gunakan email/password yang benar. Pastikan bisa redirect ke `/dashboard` dan muncul text "Welcome Author".
3. Periksa tampilan HTML `/login`. Pastikan ada `name="csrf_token"` bertipe `hidden`.
4. Paksa kirim form tanpa `csrf_token` -> ekspektasi gagal dan die.
5. Klik tombol Logout, pastikan session hilang dan tidak bisa akses `/dashboard` (redirect ke `/login`).
