User
Adalah module dasar penyedia user pada aplikasi berbasis mim. Module ini tidak
bisa berdiri sendiri, dibutuhkan module user handler yang bertugas berhubungan
langsung dengan penyedia data user seperti lib-user-main
, dan module authorizer
yang memparse request untuk menemukan informasi user yang melakukan request seperti
module lib-user-auth-cookie
.
Instalasi
Jalankan perintah di bawah di folder aplikasi:
mim app install lib-user
Penggunaan
Module ini membuat satu service dengan nama user
yang bisa di panggil dari
aplikasi dengan perintah $this->user->{method|property}
.
// ...
$this->user->isLogin();
$this->user->id;
$this->user->fullname;
$this->user->logout();
//
Method
Service user memilki beberapa method sebagai berikut:
getAuthorizer(): ?string
getByCredentials(string $identity, string $password, array $where=[]): ?object
getById(string $identity): ?object
getHandler(): ?string
getSession(): ?object
getUser(): ?object
hashPassword(string $password): ?string
isLogin(): bool
logout(): void
setAuthorizer(string $name)
setUser(object $user): void
verifyPassword(string $password, object $user): bool
Custom Handler
Module ini membutuhkan user provider, module yang disediakan sampai saat ini adalah
module lib-user-main
yang menyimpan data user di database.
Satu aplikasi hanya boleh memiliki satu user handler.
Handler harus mengimplementasikan interface LibUser\Iface\Handler
dan mendaftarkan diri
pada konfigurasi seperti di bawah:
return [
'libUser' => [
'handler' => 'Class'
]
];
User handler harus memiliki method-method sebagai berikut:
getByCredentials(string $identity, string $password, array $where=[]): ?object
Mengambil data user berdasarkan nama user ( email, phone, atau identitas lain ) dengan
password. Object user yang dikembalikan harus sama dengan struktur yang dikembalkan oleh
method getById
. Tambahan property $where
untuk menambah kondisi where pada saat mencari
user.
getById(string $identity): ?object
Mengambil user dengan pengenal identity, umumnya identity user adalah kolom id
pada tabel.
Object user yang dikembalikan harus dalam format minimal seperti di bawah:
$user = (object)[
'id' => ::int,
'name' => ::string,
'fullname' => ::string,
'password' => ::string,
'avatar' => ::string,
'status' => ::int,
'timezone' => ::string,
'created' => ::string(Y-m-d H:i:s)
];
Dengan status user adalah sebagai berikut:
status | description |
---|---|
0 | Deleted |
1 | Suspended |
2 | Unverified |
3 | Verified |
Jika properti timezone
di-set, maka system timezone akan disesuaikan dengan nilai tersebut.
getMany(array $where, int $rpp=0, int $page=1, $order=[]): ?array
Mengambil beberapa user dengan kondisi wheer sama persis dengan kondisi where model.
getOne(array $where): ?object
Mengambil satu user dengan kondisi where sama persis dengan kondisi where model.
hashPassword(string $password): ?string
Meng-hash password user.
verifyPassword(string $password, object $user): bool
Mencoba kecocokan password yang di post user dengan password user yang asli.
set(array $fields, array $where=[]): bool
Mengubah data user dengan kondisi where sama persis dengan kondisi where model.
Custom Authorizer
Selain user provider, module ini juga membutuhkan module tambahan yang bertugas meng-authorize user. Module ini bertugas mengidentifikasi user berdasarkan request yang sedang berlangsung, atau menggenerasi session/token untuk seorang user berdasarkan request dari user.
Dalam satu aplikasi mungkin memiliki beberapa authorizer, system akan mencoba satu persatu sampai menemukan authorizer yang mengembalikan identitas user login. Jika tidak ada authorizer yang mengembalikan data user login, maka user dianggap tidak login.
Semua user authorizer harus mengimplementasikan interface LibUser\Iface\Authorizer
dan
mendaftarkan diri pada konfigurasi seperti di bawaah:
return [
'libUser' => [
'authorizers' => [
'name' => 'Class'
]
]
];
Masing-masing authorizer harus memiliki method sebagai berikut:
getSession(): ?object
Fungsi untuk mengambil informasi session user yang sedang login. Secara umum, fungsi ini mengembalikan informasi sebagai berikut:
$session = (object)[
'type' => 'cookie',
'expires' => time() + 60,
'token' => 'random-string'
];
identify(): ?string
Mengidentifikasi user pada request yang sedang terjadi, jika user ditemukan, maka fungsi
ini diharapkan mengembalikan identitas user, pada umumnya nilai identitas user adalah
kolom id
pada tabel.
Fungsi ini sebaiknya menyimpan data session/token user untuk digunakan jika user akan
memanggil fungsi logout
.
loginById(string $identity): ?array
Fungsi untuk menset login user. Fungsi ini diharapkan mengembalikan object session/token yang akan diteruskan ke user. Fungsi ini yang akan di panggil kontroler ketika user sedang login. Masing-masing authorizer mungkin mengembalikan data array yang berbeda.
logout(): void
Fungsi untuk menghilangkan session/token.
Formatter
Module ini menambah satu type format dengan nama user
untuk memformat field user menjadi
object user.
'field' => [
'type' => 'user'
]
Events
user:identified
Event ini dipanggil setiap kali user yang sedang login melakukan request ke server, dan kontrol melakukan pengencekan user login. Data yang dikirimkan melalui event ini adalah object user yang sedang login.
user:authorized
Event ini harus dipanggil oleh handler dengan data user id user yang sedang login setiap kali user berhasil login, dan hanya pada proses login.
user:deauthorized
Event ini dipanggil setiap kali user yang sedang login melakukan logout.