Viết một đoạn code Middleware trong Node.js (hoặc Laravel) để đọc file cấu hình YAML này và thực hiện việc chặn/cho phép request dựa trên enabled_restrict_domain và enabled_allow_route.
Dưới đây là cách triển khai cơ chế kiểm soát truy cập này bằng một Middleware trong Node.js (sử dụng framework Express). Mô hình này mô phỏng cách một API Gateway hoặc một server Node.js đọc cấu hình và bảo vệ các route bên dưới nó.
1. Cài đặt và đọc file YAML
Chuẩn bị thư viện cần thiết. Trong Node.js, bạn cần thư viện js-yaml để parse file .yml thành object JavaScript.
npm install express js-yaml
Giả sử bạn có file config.yml nằm ở thư mục gốc:
access_controls:
enabled_restrict_domain: true
restrict_domains:
- "https://www.my-ecommerce.com"
- "https://partner-portal.com"
enabled_allow_route: true
allow_routes:
- "/api/v1/products"
- "/api/v1/categories"
2. Viết Middleware Access Control
Trái tim của hệ thống kiểm soát. Tạo file middleware/accessControl.js. Middleware này sẽ thực hiện 2 lớp kiểm tra tuần tự.
const fs = require('fs');
const yaml = require('js-yaml');
const path = require('path');
// Đọc và parse file config một lần khi khởi động server để tối ưu hiệu năng
let config;
try {
const fileContents = fs.readFileSync(path.join(__dirname, '../config.yml'), 'utf8');
config = yaml.load(fileContents).access_controls;
} catch (e) {
console.error("Lỗi đọc file cấu hình config.yml", e);
process.exit(1);
}
const accessControlMiddleware = (req, res, next) => {
// --- BƯỚC 1: KIỂM TRA DOMAIN (Origin Control) ---
if (config.enabled_restrict_domain) {
// Lấy header Origin (hoặc Referer nếu client không gửi Origin)
const origin = req.get('origin') || req.get('referer');
// Xử lý trường hợp không có Origin (thường là gọi qua Postman, cURL)
// Tùy thuộc vào chính sách bảo mật, bạn có thể chặn hoặc cho phép.
// Ở đây, ta giả định môi trường chặt chẽ: Không Origin -> Bị chặn.
if (!origin) {
return res.status(403).json({
error: "Forbidden",
message: "Missing Origin header"
});
}
// Kiểm tra xem Origin có nằm trong whitelist không
// Dùng Array.some() kết hợp startsWith() để linh hoạt xử lý trailing slash (dấu gạch chéo cuối URL)
const isDomainAllowed = config.restrict_domains.some(allowedDomain => origin.startsWith(allowedDomain));
if (!isDomainAllowed) {
console.warn(`[Blocked by Domain] Request from: ${origin}`);
return res.status(403).json({
error: "Forbidden",
message: "Domain not allowed"
});
}
}
// --- BƯỚC 2: KIỂM TRA ROUTE (Endpoint Control) ---
if (config.enabled_allow_route) {
// Lấy đường dẫn mà client đang cố gắng truy cập (không bao gồm query string)
const requestPath = req.path;
// Kiểm tra xem route hiện tại có nằm trong allow_routes hay không
// Dùng includes để so khớp chính xác.
// Trong thực tế phức tạp, bạn có thể phải dùng Regex để hỗ trợ các route động (như /api/v1/products/:id)
const isRouteAllowed = config.allow_routes.includes(requestPath);
if (!isRouteAllowed) {
console.warn(`[Blocked by Route] Attempted to access: ${requestPath}`);
return res.status(403).json({
error: "Forbidden",
message: "Route access disabled"
});
}
}
// Nếu vượt qua cả 2 cửa ải, cho phép đi tiếp vào Controller
next();
};
module.exports = accessControlMiddleware;
3. Áp dụng Middleware vào Server
Tích hợp vào Express. Tạo file server.js và nhúng middleware vừa viết vào.
const express = require('express');
const accessControlMiddleware = require('./middleware/accessControl');
const app = express();
// Đăng ký middleware áp dụng cho TẤT CẢ các route
app.use(accessControlMiddleware);
// Một số route ví dụ
app.get('/api/v1/products', (req, res) => {
res.json({ message: "Danh sách sản phẩm (Route này được phép)" });
});
app.get('/api/v1/admin/users', (req, res) => {
// Route này sẽ KHÔNG BAO GIỜ được gọi tới nếu enabled_allow_route = true
// và '/api/v1/admin/users' không nằm trong danh sách YAML
res.json({ message: "Dữ liệu người dùng bảo mật" });
});
app.listen(3000, () => {
console.log('Server Gateway đang chạy tại cổng 3000');
});
🛡️ Ghi chú về bảo mật (Security Note)
Việc dựa hoàn toàn vào HTTP Header Origin có một rủi ro nhỏ: các header này có thể bị giả mạo dễ dàng nếu request được gửi từ một server backend khác (hoặc qua Postman) thay vì trình duyệt web.
Do đó, enabled_restrict_domain chỉ hiệu quả để bảo vệ ứng dụng khỏi các cuộc tấn công CSRF từ trình duyệt, hoặc làm lớp bảo vệ thứ nhất. Nó phải được kết hợp cùng các cơ chế xác thực mạnh như JWT hoặc API Keys.
All rights reserved