Search by

adems / dapur-user

AdeMS

Modul user untuk Dapur AdeMS: akun, login, hak akses, dan riwayat login

2.0.0 2026-11-13 12:47 UTC

This package is auto-updated.

Last update: 2026-11-14 03:24:42 UTC


README

Modul user untuk Dapur AdeMS: akun, kata sandi, login dan keluar, hak akses per lingkup, pembatasan percobaan login, dan riwayat login.

Paket ini tidak membuat halaman sendiri. Modul yang memerlukan login, misalnya adems/dapur-dashboard, memasang halaman masuk dan keluar dari paket ini pada alamatnya sendiri. Satu akun user bisa diberi akses ke beberapa lingkup, misalnya dashboard utama dan beberapa website.

Kebutuhan

  • Dapur AdeMS 2.6 atau lebih baru
  • MariaDB atau MySQL yang sudah diatur di config/autoload/database.local.php (SQLite juga bisa dipakai)
  • adems/dapur-multiwebsite 1.1 atau lebih baru, bila user dipakai per website

Pemasangan

Paket ini biasanya ikut terpasang sebagai kebutuhan modul lain. Untuk memasangnya sendiri, tulis di composer.local.json, lalu jalankan composer update:

{
    "require": {
        "adems/dapur-user": "^1.0"
    }
}

Bila tabel perlu awalan nama (misalnya karena database dipakai bersama aplikasi lain), atur awalan_tabel lebih dulu (lihat Pengaturan). Lalu buat tabel dan admin pertama dari folder inti. Kata sandi diketik tanpa terlihat; minimal 12 karakter untuk admin dan 8 karakter untuk user lain:

vendor/bin/dapur-user pasang
vendor/bin/dapur-user buat-admin admin@contoh.com --nama="Nama Lengkap"

Pengaturan

Tulis di config/autoload/*.php milik inti. Pengaturan berlaku juga untuk semua website, kecuali website tersebut menimpanya di config/autoload/*.php miliknya sendiri:

return [
    'user' => [
        'awalan_tabel' => 'xyz_', // awalan nama tabel, bawaan tanpa awalan
        'riwayat_hari' => 180,    // lama riwayat login disimpan; 0 = tidak pernah dihapus
        'zona_waktu'   => 'Asia/Jakarta', // zona waktu tampilan, bawaan zona waktu PHP
    ],
];

Nama tabel

Tanpa awalan_tabel Dengan 'awalan_tabel' => 'xyz_' Isi
user xyz_user Akun user
user_akses xyz_user_akses Hak akses per lingkup
user_percobaan_masuk xyz_user_percobaan_masuk Login gagal 15 menit terakhir, untuk pembatasan
user_riwayat_masuk xyz_user_riwayat_masuk Riwayat login

Awalan hanya boleh berisi huruf, angka, dan garis bawah, paling panjang 32 karakter. Perintah dapur-user membaca pengaturan yang sama, jadi atur awalan sebelum menjalankan pasang.

Perintah

vendor/bin/dapur-user pasang                          # membuat tabel yang belum ada, aman diulang
vendor/bin/dapur-user buat-admin <email>              # membuat admin, atau menambah akses user yang sudah ada
vendor/bin/dapur-user ganti-sandi <email>             # mengganti kata sandi
vendor/bin/dapur-user riwayat <email> [--jumlah=20]   # menampilkan riwayat login user

Dengan paket multi-website, tambahkan --website=<domain> untuk website tertentu. Lingkup akses yang diberikan buat-admin adalah dashboard di inti, atau nama domain website.

pasang melaporkan setiap tabel: dibuat atau sudah ada. Tabel yang sudah ada beserta isinya tidak diubah; perintah ini tidak pernah menghapus tabel.

Bila email pada buat-admin sudah terdaftar, perintah memastikan user itu punya akses ke lingkup yang dituju, lalu menawarkan ganti kata sandi dengan jawaban bawaan "tidak". Tawaran ini hanya muncul bila perintah dijalankan di terminal; dari skrip, kata sandi tidak diubah.

Riwayat login

Setiap login berhasil, login gagal, dan keluar dicatat bersama lingkup, IP, perangkat (user agent browser), dan waktunya. Waktu disimpan dalam UTC; perintah riwayat menampilkannya menurut zona_waktu (bawaan: zona waktu PHP).

  • Login gagal dengan email yang tidak terdaftar dicatat tanpa user. Email yang diketik tidak pernah disimpan, karena orang kadang salah mengetik kata sandi di kolom email.
  • Percobaan yang ditolak karena terlalu sering tidak dicatat, agar riwayat tidak bisa dibanjiri.
  • Catatan yang lebih tua dari riwayat_hari dihapus otomatis saat ada login berhasil.

Tabel user_percobaan_masuk berbeda tujuannya: tabel itu hanya menghitung login gagal untuk pembatasan, dan isinya dihapus setelah login berhasil.

Memakai login di modul lain

Buat Pintu (lingkup akses, alamat dasar, batas diam, layout), lalu buat middleware dan handler lewat PabrikLayanan. Contoh factory di modul sendiri:

use AdeMS\Dapur\User\Middleware\MulaiSesiMiddleware;
use AdeMS\Dapur\User\PabrikLayanan;
use AdeMS\Dapur\User\Pintu;

$pintu = new Pintu('laporan', '/laporan');

// Layanan bernama milik modul, didaftarkan sebagai factory:
'laporan.wajib_masuk' => PabrikLayanan::wajibMasuk($container, $pintu),
'laporan.masuk'       => PabrikLayanan::masuk($container, $pintu),
'laporan.keluar'      => PabrikLayanan::keluar($container, $pintu),

// Route:
$app->route('/laporan/masuk', [MulaiSesiMiddleware::class, 'laporan.masuk'], ['GET', 'POST']);
$app->post('/laporan/keluar', [MulaiSesiMiddleware::class, 'laporan.wajib_masuk', 'laporan.keluar']);
$app->get('/laporan', [MulaiSesiMiddleware::class, 'laporan.wajib_masuk', LaporanHandler::class]);

Sertakan isi AdeMS\Dapur\User\ConfigProvider di ConfigProvider modul tersebut. Setelah login, user tersedia sebagai atribut request AdeMS\Dapur\User\User::class.

Template user::menu-user mengisi placeholder menu-kanan di navbar dengan avatar inisial user beserta submenu nama, email, dan tombol keluar. Template user::masuk adalah halaman login; keduanya bisa ditimpa lewat 'templates' => ['paths' => ['user' => [...]]].

Keamanan

  • Kata sandi disimpan sebagai hash bcrypt.
  • Cookie session memakai HttpOnly dan SameSite=Lax, ditambah Secure pada HTTPS. ID session diganti saat login.
  • Semua form memakai token CSRF. Keluar hanya bisa lewat POST.
  • Login gagal dibatasi per akun dan per IP selama 15 menit.
  • Status dan hak akses user diperiksa ulang pada setiap request.
  • Setelah login, user diarahkan kembali ke halaman yang diminta sebelumnya. Alamat itu disimpan di session, bukan di URL, dan hanya alamat di dalam pintu yang sama yang diterima.
  • Session disimpan di data/cache/session/, jadi folder data/cache/ harus bisa ditulis web server.

Uji

composer test

Lisensi

BSD-3-Clause. Lihat LICENSE.md.