NodeJS Ngày 4 -Thiết lập phân quyền RBAC
Các bước triển khai
- Lưu role trong Firebase hoặc Database
- Xác minh idToken từ Firebase để lấy UID
- Lấy role từ: Trường customClaims trong Firebase Auth, hoặc Bảng users trong MySQL
- Middleware kiểm tra quyền → cho phép/không cho phép
Option: Gắn role bằng Firebase custom claims (dễ tích hợp)
Gán role từ Firebase Admin SDK (chạy 1 lần):
// scripts/set-role.js (chạy riêng)
const admin = require('../firebase/firebase.config');
admin.auth().setCustomUserClaims('<firebase-uid>', { role: 'ADMIN' })
.then(() => console.log('Role set successfully'))
.catch(console.error);
1. Cập nhật authMiddleware để đọc role
const admin = require('../firebase/firebase.config');
const authMiddleware = async (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Authorization header missing or malformed' });
}
const idToken = authHeader.split('Bearer ')[1];
try {
const decodedToken = await admin.auth().verifyIdToken(idToken);
req.user = {
uid: decodedToken.uid,
email: decodedToken.email,
name: decodedToken.name,
picture: decodedToken.picture,
role: decodedToken.role || 'CUSTOMER' // default if not set
};
next();
} catch (err) {
return res.status(401).json({ error: 'Invalid or expired token' });
}
};
module.exports = authMiddleware;
2. Tạo Middleware kiểm tra vai trò
Trong file middlewares/role.middleware.js
const allowRoles = (...allowedRoles) => {
return (req, res, next) => {
const userRole = req.user?.role;
if (!userRole || !allowedRoles.includes(userRole)) {
return res.status(403).json({ error: 'Access denied: insufficient permissions' });
}
next();
};
};
module.exports = allowRoles;
3. Sử dụng trong routes
const express = require('express');
const router = express.Router();
const authMiddleware = require('../middlewares/auth.middleware');
const allowRoles = require('../middlewares/role.middleware');
router.get(
'/dashboard',
authMiddleware,
allowRoles('ADMIN', 'SYSADMIN'), // chỉ cho admin và sysadmin
(req, res) => {
res.json({ message: 'Welcome to admin dashboard' });
}
);
router.get(
'/sys-only',
authMiddleware,
allowRoles('SYSADMIN'), // chỉ sysadmin mới vào được
(req, res) => {
res.json({ message: 'Welcome, sysadmin' });
}
);
module.exports = router;
Qua bài viết này, chung ta cơ bản đã tạo được phân quyền cho hệ thống.
Nhiên.
All rights reserved