Files
GSM/gsm-backend/middleware/auth.js
Alexander Zielonka 3dc7e9e7e7
All checks were successful
Deploy GSM / deploy (push) Successful in 26s
Restrict server detail access for guests
- Add isGuest flag to UserContext
- Block guests from navigating to /server/:id route
- Make ServerCards non-clickable for guests
- Add rejectGuest middleware to backend
- Protect server detail endpoints (/:id, /metrics/history, /whitelist)

Guests can now only view the dashboard overview without accessing
individual server details.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 20:57:34 +01:00

68 lines
1.6 KiB
JavaScript

import jwt from 'jsonwebtoken';
const ROLE_HIERARCHY = {
'user': 1,
'moderator': 2,
'superadmin': 3
};
export function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token required' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
return res.status(403).json({ error: 'Invalid token' });
}
req.user = user;
next();
});
}
// Optional authentication - doesn't fail if no token
export function optionalAuth(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
req.user = null;
return next();
}
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) {
req.user = null;
} else {
req.user = user;
}
next();
});
}
export function requireRole(minRole) {
return (req, res, next) => {
const userRole = req.user?.role || 'user';
const userLevel = ROLE_HIERARCHY[userRole] || 0;
const requiredLevel = ROLE_HIERARCHY[minRole] || 0;
if (userLevel < requiredLevel) {
return res.status(403).json({ error: 'Insufficient permissions' });
}
next();
};
}
export function rejectGuest(req, res, next) {
if (!req.user) {
return res.status(401).json({ error: 'Authentication required' });
}
if (req.user.isGuest || req.user.role === 'guest') {
return res.status(403).json({ error: 'Guests cannot access server details' });
}
next();
}