【发布时间】:2018-03-30 03:54:31
【问题描述】:
我已阅读有关论点的所有内容,但仍然无法理解。 Passport Js 网站上的文档非常模糊。
我正在使用 Passport JS 和 passport-ldapauth 策略。 我没有数据库。 我显然不想在每个请求上都访问 LDAP 服务器。 我想在 POST /login 路由上使用 LDAP 的护照策略第一次对用户进行身份验证,将用户存储在会话和每个后续请求我只想检查用户是否已经登录。
我正在尝试使用会话,但我无法理解如何将 Passport + 会话与序列化/反序列化流程一起使用。 我检查的每个示例都在 deserializeUser 函数中使用 User.findOne。
截至目前,我禁用了 Passport 会话,我正在使用自定义中间件检查 req.session.user != null。如果是这种情况,用户已经登录,我点击next()。否则重定向到登录。
这是一些代码(为简单起见,我删除了与问题无关的代码):
护照配置:
var express = require('express'),
session = require('express-session'),
passport = require('passport'),
LdapStrategy = require('passport-ldapauth');
var app = express();
var LdapStrategyOptions = {
server: {
url: '<url>',
bindDN: '<dn>',
bindCredentials: "<pwd>",
searchBase: '<searchBase>',
searchFilter: '<filter>'
}
};
passport.use(new LdapStrategy(LdapStrategyOptions));
app.use(cookieParser());
app.use(session({
store: new LokiStore({autosave: false}),
resave: false,
saveUninitialized: false
secret: env.get("SESSION_SECRET")
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());
路线:
// LOGIN ROUTE
app.get('/login',
function(req, res) {
res.render('login');
});
// LOGIN HANDLER ROUTE
app.post('/login',
passport.authenticate('ldapauth', { session: false }),
function(req, res) {
req.session.userId = req.user.cn;
req.session.user = {
"userId": req.user.cn,
"displayName": req.user.displayName
};
res.redirect('/');
});
// LOGOUT ROUTE
app.get('/logout',
function(req, res) {
req.session.destroy(function(err) {
req.logout();
res.redirect('/');
});
});
// HOME ROUTE
app.get('/', isLoggedIn, function(req, res) {
res.render('home');
});
IsLoggedIn 中间件:
var isLoggedIn = function(req, res, next) {
if (req.session.user != null){
console.log("is auth ok '" + req.session.user.userId +"'");
return next();
}
console.log("redirect to auth/login");
res.redirect('/auth/login');
}
我错过了什么?我的设置中是否存在任何安全问题? 任何帮助表示赞赏。
【问题讨论】:
-
你有没有可能错过了
app.use(passport.session());? -
没有。我从示例代码中删除了它,因为正如我写的那样,我没有使用它,因为我不明白我应该在 passport.deserializeUser() 中写什么。示例 cose 正是我发现使其与自定义会话管理一起使用的方式。
标签: node.js session authentication ldap passport.js