Strategi User Permission/Roles dalam Hook dengan MySQL di Feathers JS

Nur Prasetyo
SkyshiDigital
Published in
3 min readJan 14, 2019

Halo, perkenalkan saya Nur Prasetyo. Dalam artikel kali ini saya akan membahas tentang strategi user permission/roles dalam Hook di Feathers JS. Mari kita ulas tentang apa itu Feathers JS. Feathers JS adalah salah satu framework untuk membangun sebuah Rest API(Application Programming Interface) ataupun website secara keseluruhan pengembangan dari Express JS yang merupakan framework dari Node JS. fitur utama dalam Feather JS adalah service dan hook. Mengapa menggunakan Feather JS? karena merupakan framework yang ringan yang sesuai dengan semboyannya “A minimalist real-time framework for tomorrow’s apps” selain itu Feathers JS merupakan framework yang dapat digunakan untuk kerja cepat seperti untuk kejar target, dll. karena memang sudah dilengkapi fitur-fitur dan library untuk membangun Rest API maupun realtime website.

Saya termasuk orang yang baru mempelajari Feathers JS maupun Node JS. Dalam belajar membangun Rest API dengan Feathers JS saya membutuhkan hak akses untuk membatasi ataupun untuk manajemen aksi apa saja yang boleh dilakukan oleh pengguna berdasarkan role masing-masing. Setelah membaca beberapa referensi dari Access control strategies with FeathersJS dan Easy API Authorization with CASL and Feathers saya belum menemukan solusi untuk mengatur hak akses pengguna dalam Feathers JS dan yang dibutuhkan adalah suatu fungsi berdasarkan role yang didapatkan dari database dan dinamis, sehingga apabila terdapat penambahan role ataupun permission cukup didefinisikan dalam rules yang tersedia. Setelah berdiskusi dengan senior saya @masroy, saya mendapatkan saran untuk menggunakan fungsi mengecek role pengguna dalam Hook dengan parameter data pengguna yang didapatkan dari autentikasi JWT. Dari saran yang didapat saya berfikir untuk mengembangkan saran dan contoh dari senior untuk membuat fungsi yang lebih dinamis. Syaratnya dalam tabel pengguna sudah terdapat kolom role.

Dalam kasus yang saya kerjakan yaitu membuat hak akses dimana admin dapat melakukan semua aksi (full control) dan pengguna biasa yang sudah terdaftar dibatasi untuk mengubah profil dan melihat data masing-masing. Berikut contoh rancangan tabel:

CREATE TABLE `Users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(14) DEFAULT NULL,
`gender` varchar(1) DEFAULT NULL,
`role` varchar(10) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`username` varchar(30) DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`status` int(11) DEFAULT ‘1’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

Pastikan sudah menggunakan autentikasi dalam Rest API. Berikutnya buat fungsi untuk validasi role pengguna sebagai contoh validator.hooks.js, dalam file ini berisi fungsi untuk validasi route/path dan method yang boleh dilakukan oleh pengguna. Sebagai contoh admin boleh mengakses path users dengan semua method tetapi pengguna biasa hanya boleh mengakses method get,update,patch. Berikut kode untuk file validasi:

Tambahan untuk konstanta roles juga dapat didefinisikan dalam file environment .env, sehingga setiap menambah hak akses pengguna harus didefinikan terlebih dahulu dalam roles permissions dengan format path:method. Selanjutnya buat file self.hooks.js untuk validasi bahwa parameter id adalah id pengguna tersebut, fungsi ini untuk kasus pengguna yang hanya diberi akses ubah dan melihat profil sendiri. Berikut kode file tersebut:

Setelah kedua fungsi validasi dibuat maka panggil dalam hook. Berikut contohnya:

Dari kode diatas cukup memanggil fungsi validate pada method all, karena validasi dilakukan pada fungsi validator berdasarkan konstanta roles. fungsi self dipanggil pada 3 method dengan parameter role user’ yang menyatakan pengguna biasa hanya bisa mengakses data dengan id pengguna yang sesuai pengguna saat login.

Dari kasus-kasus diatas menuntut developer untuk terus berkreasi dan pantang menyerah untuk mendapatkan solusi terbaik baik dengan mencari referensi di internet maupun dengan bertanya dengan yang lebih berpengalaman. Saya berharap dapat terus belajar dan memperbaiki kode agar semakin reuseable dan dinamis.

Demikian artikel yang dapat saya sampaikan, menyadari bahwa saya masih baru didunia NodeJS sehingga banyak kekurangan dalam artikel dan fungsi diatas saya mohon maaf.

Jangan pernah berhenti untuk belajar ^.^

Terima kasih.

--

--