feat: add admin config loader with multi-key support
Made-with: Cursor
This commit is contained in:
4
backend/config/admins.example.json
Normal file
4
backend/config/admins.example.json
Normal file
@@ -0,0 +1,4 @@
|
||||
[
|
||||
{ "name": "Alice", "key": "change-me-alice-key" },
|
||||
{ "name": "Bob", "key": "change-me-bob-key" }
|
||||
]
|
||||
55
backend/config/load-admins.js
Normal file
55
backend/config/load-admins.js
Normal file
@@ -0,0 +1,55 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const DEFAULT_CONFIG_PATH = path.join(__dirname, 'admins.json');
|
||||
|
||||
function loadAdmins() {
|
||||
const configPath = process.env.ADMIN_CONFIG_PATH || DEFAULT_CONFIG_PATH;
|
||||
|
||||
if (fs.existsSync(configPath)) {
|
||||
const raw = fs.readFileSync(configPath, 'utf-8');
|
||||
const admins = JSON.parse(raw);
|
||||
|
||||
if (!Array.isArray(admins) || admins.length === 0) {
|
||||
throw new Error(`Admin config at ${configPath} must be a non-empty array`);
|
||||
}
|
||||
|
||||
const names = new Set();
|
||||
const keys = new Set();
|
||||
|
||||
for (const admin of admins) {
|
||||
if (!admin.name || !admin.key) {
|
||||
throw new Error('Each admin must have a "name" and "key" property');
|
||||
}
|
||||
if (names.has(admin.name)) {
|
||||
throw new Error(`Duplicate admin name: ${admin.name}`);
|
||||
}
|
||||
if (keys.has(admin.key)) {
|
||||
throw new Error(`Duplicate admin key found`);
|
||||
}
|
||||
names.add(admin.name);
|
||||
keys.add(admin.key);
|
||||
}
|
||||
|
||||
console.log(`[Auth] Loaded ${admins.length} admin(s) from ${configPath}`);
|
||||
return admins;
|
||||
}
|
||||
|
||||
if (process.env.ADMIN_KEY) {
|
||||
console.log('[Auth] No admins config file found, falling back to ADMIN_KEY env var');
|
||||
return [{ name: 'Admin', key: process.env.ADMIN_KEY }];
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
'No admin configuration found. Provide backend/config/admins.json or set ADMIN_KEY env var.'
|
||||
);
|
||||
}
|
||||
|
||||
const admins = loadAdmins();
|
||||
|
||||
function findAdminByKey(key) {
|
||||
const match = admins.find(a => a.key === key);
|
||||
return match ? { name: match.name } : null;
|
||||
}
|
||||
|
||||
module.exports = { findAdminByKey, admins };
|
||||
Reference in New Issue
Block a user