Enforce role-based authorization on admin-only routes (#10)

isLoggedIn only verified a valid JWT, so an authenticated editor could
call any admin endpoint (create/promote/delete users, flip site mode,
change settings). Add a requireRole middleware factory and gate the
sensitive routes with admin-only:

- PUT  /site-mode
- GET/PUT /settings
- all /users/* (list/create/update/delete)

Content routes (posts, wiki, categories, tags, uploads, dashboard,
activity) remain available to editors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 21:15:12 -05:00
parent 52c74db825
commit 20d7150ab4
2 changed files with 21 additions and 4 deletions

View File

@@ -85,6 +85,16 @@ function isLoggedIn(req, res, next) {
return next()
}
// Gate middleware factory: allow only the listed roles. Assumes isLoggedIn ran
// first so req.user is populated. Use for admin-only endpoints (users, site
// mode, settings) so a lower-privilege editor cannot reach them.
function requireRole(...roles) {
return (req, res, next) => {
if (roles.includes(req.user?.role)) return next()
return res.status(403).json({ message: 'Forbidden' })
}
}
module.exports = {
COOKIE_NAME,
signToken,
@@ -93,4 +103,5 @@ module.exports = {
clearAuthCookie,
getUserFromRequest,
isLoggedIn,
requireRole,
}