Express框架下如何为/admin下指定路由跳过身份校验中间件
解决方案
有三种常用的实现方式,按推荐度排序如下:
方案1:调整路由挂载顺序(最简便)
Express的中间件/路由是按书写顺序依次匹配执行的,你可以把不需要鉴权的/admin/login路由单独提前挂载,优先级高于带adminAuthMW的路由组即可:
// 先挂载不需要鉴权的admin登录路由 app.get('/admin/login', (req, res) => { if(req.cookies.jwt){ res.redirect('/admin') } else { res.render('admin/login') } }) // 再挂载带鉴权中间件的admin路由组 app.use('/admin', adminAuthMW, adminGetRoutes, adminPostRoutes) // 记得把adminGetRoutes里原来的/login路由删除,避免重复定义
方案2:在鉴权中间件中加路径白名单判断
修改adminAuthMW的逻辑,匹配到登录路径时直接跳过鉴权:
const adminAuthMW = (req, res, next) => { // 白名单路径直接放行,因中间件挂载在/admin前缀下,req.path为去掉前缀后的路径 if (req.path === '/login') { return next() } // 保留原有鉴权逻辑 // ... 你的JWT校验等原有代码 }
方案3:拆分admin路由组
把admin路由拆分为「无需鉴权」和「需鉴权」两个分组分开挂载,后续新增公开路由也可以直接放在公开分组里:
// admin公开路由组,不需要鉴权 const adminPublicRoutes = express.Router() adminPublicRoutes.get('/login', (req, res) => { if(req.cookies.jwt){ res.redirect('/admin') } else { res.render('admin/login') } }) // admin私有路由组,需要鉴权 const adminPrivateRoutes = express.Router() // 原有adminGetRoutes里除了login的其他路由都挪到该分组下 // ... // 挂载公开路由 app.use('/admin', adminPublicRoutes) // 挂载带鉴权的私有路由 app.use('/admin', adminAuthMW, adminPrivateRoutes, adminPostRoutes)
内容的提问来源于stack exchange,提问作者saintyusuf
相关产品推荐
相关产品推荐

