+1

NodeJS Ngày 4 -Thiết lập phân quyền RBAC

Các bước triển khai

  1. Lưu role trong Firebase hoặc Database
  2. Xác minh idToken từ Firebase để lấy UID
  3. Lấy role từ: Trường customClaims trong Firebase Auth, hoặc Bảng users trong MySQL
  4. 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

Viblo
Let's register a Viblo Account to get more interesting posts.