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
相关产品推荐
相关产品推荐

