我已经阅读了所有论点,但仍然无法理解它。 Passport Js网站上的文档非常含糊。Passport js serializeUser&deserializeUser
我正在使用护照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就是我发现的使自定义会话管理工作的方式。 – Roberto