我在加载所有页面之前尝试使用authenticateUser()中间件。而不是在每个调用中包含它(如在app.get('/',authenticateUser,function()...)),我尝试在调用app.use(app.router)之前使用app.use(authenticateUser)进行设置)。
但是,这没有用。 authenticateUser基本上是:if (req.session.loginFailed) {
next()
else {
if (req.session.user_id) {
...
if (userAuthenticated) {
next();
} else {
req.session.loginFailed = true;
console.log('setting loginFailed to true');
res.redirect('/login');
}
}
}
然后在app.get('/ login')中我将req.session.loginFailed设置为false;
这应该可行,但我只想在app.get()或app.post()等上为我的一个实际页面调用它。我认为很多时候它会被许多不同的请求调用(因为在加载一个页面时,'设置loginFailed为true'被多次调用)
有更好的方法吗?或者我应该在我网站上的每个页面之前调用它吗?
答案 0 :(得分:9)
在我看来,你做的太多了。只有一条路由应该处理用户登录(检查用户和传递,如果成功则将用户名存储在会话中),并且只应在需要auth(不是全部)的路由上分配auth中间件。
我已经提出了一个简化的例子,以便您理解我的观点:
登录路线
app.post('/login', function (req, res) {
var variables_set = (req.body.user && req.body.pass);
if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) {
req.session.username = req.body.user;
} else {
res.redirect('/login?failed=true');
}
});
身份验证中间件
if (!req.session.username) {
res.redirect('/login');
} else {
next();
}
您可以在Alex Young的Nodepad应用程序中看到更完整的示例:https://github.com/alexyoung/nodepad(此应用程序的教程:http://dailyjs.com/tags.html#lmawa)