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.