如何利用PassportJs实现未登录用户全路由重定向至登录页?
用PassportJS实现全局路由的登录校验自动重定向
当然可以不用在每个GET路由里重复写登录判断逻辑,核心思路是利用Express的中间件机制,编写一个全局的登录校验中间件,统一处理未登录用户的重定向。
步骤1:编写登录校验中间件
先定义一个中间件函数,用来判断用户是否已登录:
function ensureAuthenticated(req, res, next) { // 如果用户已登录,继续执行后续的路由处理逻辑 if (req.isAuthenticated()) { return next(); } // 未登录则直接重定向到登录页 res.redirect('/login'); }
步骤2:应用中间件到全局路由
有两种方式可以把这个中间件应用到所有需要校验的路由:
方式一:全局覆盖所有GET路由(需先定义无需校验的路由)
如果你希望所有GET路由都强制校验登录,但登录页、注册页这类路由不需要校验,要先把这些无需校验的路由定义在前面,再应用全局中间件:
// 先定义无需登录即可访问的路由 app.get('/login', (req, res) => { res.render('login'); }); app.get('/register', (req, res) => { res.render('register'); }); // 对所有剩余的GET路由应用登录校验中间件 app.get('*', ensureAuthenticated);
方式二:中间件内排除无需校验的路径
如果不想调整路由定义顺序,可以在中间件里直接排除不需要校验的路径,然后全局应用到所有请求(或指定HTTP方法):
function ensureAuthenticated(req, res, next) { // 列出无需登录即可访问的路径 const unprotectedPaths = ['/login', '/register']; if (unprotectedPaths.includes(req.path)) { return next(); } if (req.isAuthenticated()) { return next(); } res.redirect('/login'); } // 应用到所有HTTP请求(GET/POST等) app.use(ensureAuthenticated);
步骤3:简化原有路由逻辑
因为中间件已经完成了登录校验,原来的根路由可以去掉重复的判断逻辑,简化成:
app.get('/', function(req, res){ List.find({}, function(err, results){ if(!err){ res.render('home'); } else { // 补充错误处理,避免静默失败 res.status(500).send('获取列表数据失败'); } }); });
注意事项
- 中间件顺序至关重要:Express会按照中间件和路由的定义顺序依次执行,所以要确保无需校验的路由或排除逻辑优先执行,否则用户会被强制重定向到登录页,连登录入口都访问不了。
- 按需扩展校验范围:如果POST路由也需要登录校验,只需把中间件应用到POST路由(比如
app.post('*', ensureAuthenticated)),或者直接用app.use覆盖所有HTTP方法。
内容的提问来源于stack exchange,提问作者Ema5515
相关产品推荐
相关产品推荐

