Tentu! Berikut adalah dokumentasi fitur autentikasi secara lengkap dalam format DokuWiki, termasuk struktur dan detail setiap bagian:

```markdown ## Fitur Autentikasi

### 1. Pengantar

Fitur autentikasi aplikasi billing ini dirancang untuk mengelola akses pengguna dengan berbagai peran (admin, customer, operator, teknisi). Fitur ini mencakup proses login, logout, dan kontrol akses berdasarkan peran.

### 2. Konfigurasi Awal

#### 2.1. Konfigurasi Database

Pastikan tabel `users` telah dibuat di database dengan struktur berikut:

```sql CREATE TABLE users (

  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(100) NOT NULL,
  password VARCHAR(255) NOT NULL,
  email VARCHAR(100) NOT NULL,
  role ENUM('admin', 'customer', 'operator', 'teknisi') NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

); ```

#### 2.2. Instalasi CodeIgniter 3

1. Unduh dan instal CodeIgniter 3 dari situs resmi CodeIgniter. 2. Konfigurasi database di file `application/config/database.php`.

### 3. Model

#### 3.1. Model `User_model`

Lokasi: `application/models/User_model.php`

```php <?php class User_model extends CI_Model {

  public function __construct() {
      $this->load->database();
  }
  public function get_user_by_username($username) {
      $query = $this->db->get_where('users', array('username' => $username));
      return $query->row_array();
  }
  public function create_user($data) {
      return $this->db->insert('users', $data);
  }

} ```

#### 3.2. Model `Auth_model`

Lokasi: `application/models/Auth_model.php`

```php <?php class Auth_model extends CI_Model {

  public function __construct() {
      $this->load->database();
  }
  public function check_login($username, $password) {
      $this->db->where('username', $username);
      $this->db->where('password', md5($password)); // Ganti dengan hashing yang lebih aman di produksi
      $query = $this->db->get('users');
      return $query->row_array();
  }

} ```

### 4. Controller

#### 4.1. Controller `Auth`

Lokasi: `application/controllers/Auth.php`

```php <?php class Auth extends CI_Controller {

  public function __construct() {
      parent::__construct();
      $this->load->model('Auth_model');
      $this->load->library('session');
  }
  public function login() {
      $this->load->view('login');
  }
  public function login_process() {
      $username = $this->input->post('username');
      $password = $this->input->post('password');
      $user = $this->Auth_model->check_login($username, $password);
      if ($user) {
          $this->session->set_userdata('user_id', $user['id']);
          $this->session->set_userdata('role', $user['role']);
          redirect('dashboard');
      } else {
          $this->session->set_flashdata('error', 'Invalid Username or Password');
          redirect('auth/login');
      }
  }
  public function logout() {
      $this->session->sess_destroy();
      redirect('auth/login');
  }

} ```

### 5. View

#### 5.1. View `login.php`

Lokasi: `application/views/login.php`

```html <!DOCTYPE html> <html> <head>

  <title>Login</title>

</head> <body>

  <h1>Login</h1>
  <?php if ($this->session->flashdata('error')): ?>
      <p style="color: red;"><?php echo $this->session->flashdata('error'); ?></p>
  <?php endif; ?>
  <form action="<?php echo site_url('auth/login_process'); ?>" method="post">
      <label for="username">Username:</label>
      <input type="text" name="username" id="username" required>
      <br>
      <label for="password">Password:</label>
      <input type="password" name="password" id="password" required>
      <br>
      <input type="submit" value="Login">
  </form>

</body> </html> ```

### 6. Middleware (Opsional)

#### 6.1. Custom Controller Base

Lokasi: `application/core/MY_Controller.php`

```php <?php class MY_Controller extends CI_Controller {

  public function __construct() {
      parent::__construct();
      $this->check_login();
  }
  private function check_login() {
      if (!$this->session->userdata('user_id')) {
          redirect('auth/login');
      }
  }

} ```

- Extend controller Anda dari `MY_Controller` untuk menerapkan proteksi login.

### 7. Pengujian

#### 7.1. Uji Fitur Login

- Cobalah login dengan berbagai kombinasi username dan password. - Pastikan pengguna diarahkan ke halaman yang tepat berdasarkan role mereka setelah login.

#### 7.2. Uji Fitur Logout

- Pastikan sesi dihapus dan pengguna diarahkan ke halaman login setelah logout.

#### 7.3. Uji Kontrol Akses

- Verifikasi bahwa akses ke halaman dan fitur dibatasi berdasarkan role pengguna.

### 8. Keamanan

#### 8.1. Hashing Password

- Gantilah penggunaan `md5` dengan hashing yang lebih aman, seperti `bcrypt` atau `argon2`.

#### 8.2. Validasi Input

- Pastikan semua input pengguna divalidasi dan disanitasi untuk menghindari serangan.

```

Cara menambahkan dokumentasi ini ke DokuWiki:

1. Masuk ke DokuWiki:

  1. Akses DokuWiki Anda melalui URL `http://wiki.eri.web.id`.
  2. Login jika diperlukan.

2. Buat atau Edit Halaman:

  1. Jika halaman baru, klik “Buat halaman ini” (atau “Create this page”) dari halaman utama.
  2. Jika halaman sudah ada, cari dan buka halaman tersebut untuk diedit.

3. Salin dan Tempel Konten:

  1. Salin teks di atas dan tempelkan ke dalam editor DokuWiki.

4. Simpan Halaman:

  1. Klik tombol “Simpan” untuk menyimpan perubahan.

Dengan format ini, Anda akan memiliki dokumentasi yang jelas dan terstruktur di DokuWiki mengenai fitur autentikasi untuk aplikasi billing Anda.