Implementasi Otorisasi dengan Role-Based Access Control (RBAC) di Express.js
Setelah kita mempelajari cara menangani autentikasi dan otorisasi menggunakan JWT dan Passport.js, saatnya untuk memperkenalkan kontrol akses berbasis peran atau Role-Based Access Control (RBAC) ke dalam aplikasi backend kita. RBAC memungkinkan kita untuk memberikan hak akses berbeda kepada pengguna berdasarkan peran mereka (misalnya, admin, editor, dan user biasa).
Apa itu RBAC?
Role-Based Access Control adalah model keamanan yang membatasi akses ke sumber daya hanya untuk pengguna yang memiliki peran tertentu. Dalam RBAC, setiap pengguna diberi satu atau lebih peran, dan setiap peran memiliki izin yang terkait dengan akses ke sumber daya tertentu.
Membuat dan Menetapkan Peran Pengguna
Langkah pertama adalah mendefinisikan peran yang ada dalam aplikasi kita. Biasanya, ini dilakukan dengan membuat model pengguna yang mencakup atribut untuk peran pengguna. Sebagai contoh, kita akan membuat tiga peran: admin, editor, dan user.
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true },
role: { type: String, enum: ['admin', 'editor', 'user'], default: 'user' }
});
const User = mongoose.model('User', userSchema);
module.exports = User;
Menambahkan Middleware Otorisasi
Kita perlu menambahkan middleware yang akan memeriksa peran pengguna sebelum memberikan akses ke route tertentu. Middleware ini akan memeriksa apakah pengguna memiliki peran yang sesuai untuk mengakses sumber daya yang diminta.
function authorize(roles = []) {
// Jika roles adalah string, ubah menjadi array
if (typeof roles === 'string') {
roles = [roles];
}
return (req, res, next) => {
if (!roles.length || roles.includes(req.user.role)) {
return next();
} else {
return res.status(403).send('Forbidden: Insufficient permissions');
}
};
}
Menerapkan Middleware Otorisasi pada Route
Setelah membuat middleware otorisasi, kita dapat menambahkan middleware ini ke route tertentu untuk membatasi akses berdasarkan peran pengguna. Berikut adalah contoh cara menggunakan middleware otorisasi pada route untuk admin dan editor:
app.get('/admin', authorize('admin'), (req, res) => {
res.send('Welcome to the Admin Dashboard!');
});
app.get('/editor', authorize(['admin', 'editor']), (req, res) => {
res.send('Welcome to the Editor Dashboard!');
});
app.get('/profile', authorize(['admin', 'editor', 'user']), (req, res) => {
res.send('Welcome to your Profile!');
});
Login dan Pengaturan Token untuk RBAC
Selain menggunakan Passport.js untuk autentikasi, kita juga akan membuat token JWT yang menyertakan informasi peran pengguna untuk otorisasi. Berikut adalah contoh login route yang mengembalikan JWT dengan peran pengguna:
app.post('/login', passport.authenticate('local', { session: false }), (req, res) => {
const token = generateToken(req.user);
res.json({ token: token });
});
Melindungi Endpoint dengan Otorisasi
Dengan otorisasi RBAC yang sudah diterapkan, endpoint tertentu hanya dapat diakses oleh pengguna dengan peran yang sesuai. Misalnya, pengguna dengan peran admin dapat mengakses halaman admin, tetapi pengguna dengan peran user tidak akan bisa mengaksesnya:
app.get('/admin', authorize('admin'), (req, res) => {
res.send('Admin Dashboard');
});
app.get('/editor', authorize(['admin', 'editor']), (req, res) => {
res.send('Editor Dashboard');
});
Kesimpulan
Dengan menggunakan Role-Based Access Control (RBAC) di Express.js, kita dapat dengan mudah mengelola hak akses pengguna dan memastikan bahwa hanya pengguna dengan peran yang sesuai yang dapat mengakses route tertentu. Mengkombinasikan autentikasi dengan Passport.js dan otorisasi berbasis peran dengan middleware memungkinkan kita untuk membangun aplikasi web yang aman dan terstruktur dengan baik.