You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:57:17