在Node.js的AdminBro中如何仅允许管理员访问管理页面
代码不生效的原因
你当前的写法不符合Express的中间件注册逻辑:app.use()是全局注册路由的方法,写在/admin的GET路由回调内部时,只有第一次有用户访问/admin接口时才会挂载adminRouter,且挂载完成后所有用户都可以直接访问/admin下的所有子路径,不会再走你写的权限判断逻辑,完全达不到校验效果。
正确实现方案
1. 抽离统一的管理员权限校验中间件
const adminAuthCheck = (req, res, next) => { // 先判断用户是否已登录,避免req.user为空时报错 if (!req.user) { return res.redirect('/login') } // 角色判断:如果roles是数组格式,替换为req.user.roles.includes('admin') if (req.user.roles === 'admin') { next() } else { res.redirect('/') } }
2. 按顺序挂载中间件和AdminBro路由
将权限校验中间件放在adminRouter之前,所有/admin前缀的请求都会先经过权限校验,校验通过才会进入AdminBro的处理逻辑:
app.use('/admin', adminAuthCheck, adminRouter)
注意事项
- 确保用户认证中间件(如Passport.js)配置正常,
req.user能正确拿到当前登录用户的信息 - 不要在任意路由的回调函数内使用
app.use注册路由或中间件,会导致路由匹配逻辑混乱
内容的提问来源于stack exchange,提问作者Chukwuma Kingsley
相关产品推荐
相关产品推荐

