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

Express+Passport-LDAP(Node.js):如何将变量传递至其他中间件?

在Express中传递变量到其他中间件的方法

嘿,很高兴看到你的passport-ldapauth策略已经正常跑起来了!关于在Express框架里把变量传递给后续中间件,这里有几个实用的方案,结合你的场景给你拆解下:

1. 最常用:给req对象挂载自定义属性

每个请求的req对象是专属当前请求的,你可以在认证完成后直接把需要传递的变量挂到req上,后面的中间件就能直接访问到。

方式一:在路由处理链中添加中间件

比如在你的/login路由里,认证成功后挂载变量:

app.post('/login', 
  passport.authenticate('ldapauth', { session: false }), 
  (req, res, next) => {
    // 把LDAP返回的用户信息挂载到req上,也可以自定义其他变量
    req.currentAuthenticatedUser = req.user;
    req.ldapDomain = 'My Company Group'; // 自定义变量
    next(); // 调用next进入下一个中间件
  },
  (req, res) => {
    // 这个中间件就能拿到上面挂载的变量了
    console.log('当前用户:', req.currentAuthenticatedUser.uid);
    res.status(200).send({ message: '登录成功', user: req.currentAuthenticatedUser });
  }
);

方式二:在LDAP策略回调中直接操作req

如果你需要在LDAP认证的过程中就传递变量,可以开启passReqToCallback选项,这样策略回调就能拿到req参数:

// 修改你的OPTS配置,开启passReqToCallback
var OPTS = {
  passReqToCallback: true, // 关键:让策略回调能访问req
  server: {
    url: 'ldap://myipldap:389',
    bindDn: 'uid={{username}},O=My Company Group',
    searchBase: 'O=My Company Group',
    searchFilter: 'uid={{username}}'
  }
};

// 此时策略回调会多一个req参数
passport.use(new LdapStrategy(OPTS, function(req, user, done) {
  // 在这里给req挂载变量,比如处理后的用户信息
  req.processedUser = {
    id: user.uid,
    fullName: user.cn,
    department: user.department
  };
  done(null, user); // 正常完成认证
}));

2. 用res.locals传递给视图或后续中间件

如果你需要把变量传递给模板视图,或者希望后续中间件和视图都能访问,可以用res.locals,它的变量会绑定到当前请求的响应对象上:

app.post('/login', passport.authenticate('ldapauth'), (req, res, next) => {
  res.locals.user = req.user;
  res.locals.loginTime = new Date().toLocaleString();
  next();
}, (req, res) => {
  // 中间件里可以访问res.locals
  console.log('登录时间:', res.locals.loginTime);
  // 如果用模板引擎(比如EJS、Pug),模板里直接就能用{{user.uid}}这类变量
  res.render('dashboard');
});

3. 通过Session传递(如果开启了会话)

你已经配置了serializeUser和deserializeUser,如果你的passport是启用Session的(默认开启),那么认证后的用户信息会自动存在req.user里,后续任何路由中间件只要用户已登录,都能直接拿到:

// 比如在个人资料路由里
app.get('/profile', (req, res) => {
  // 用req.isAuthenticated()判断用户是否登录
  if (req.isAuthenticated()) {
    console.log('用户信息:', req.user);
    res.send(`欢迎回来,${req.user.cn}`);
  } else {
    res.redirect('/login');
  }
});

内容的提问来源于stack exchange,提问作者Gianluca Mazzeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:23