0

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
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí