adems / dapur-user
Modul user untuk Dapur AdeMS: akun, login, hak akses, dan riwayat login
Requires
- php: ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0
- composer-runtime-api: ^2.0
- ext-session: *
- laminas/laminas-db: ^2.22
- laminas/laminas-diactoros: ^3.9
- mezzio/mezzio-template: ^3.0
- psr/container: ^1.1 || ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- adems/dapur-multiwebsite: ^1.1
- phpunit/phpunit: ^11.5
Suggests
- adems/dapur-dashboard: Dashboard yang memakai login dari paket ini
- adems/dapur-multiwebsite: Diperlukan untuk hak akses dan session per website
Provides
None
Conflicts
None
Replaces
None
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_haridihapus 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 folderdata/cache/harus bisa ditulis web server.
Uji
composer test
Lisensi
BSD-3-Clause. Lihat LICENSE.md.