我正在尝试在加载所有页面之前使用authenticateUser() 中间件。我没有将其包含在每次调用中(如 app.get('/',authenticateUser, function()...) 中所示),而是尝试在调用 app.use(app.router) 之前使用 app.use(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”被调用了很多次)
有一个更好的方法吗?或者我应该在网站的每个页面之前调用它?
在我看来,你在那里做了太多的检查。只有一个路由应该处理用户登录(检查用户和密码,如果成功,则将用户名存储在会话中),并且您应该仅在需要身份验证的路由(不是全部)上分配身份验证中间件。
我举了一个简化的例子,这样你就可以理解我的观点:
登录路径
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 https://github.com/alexyoung/nodepad(该应用程序的教程在这里:http://dailyjs.com/tags.html#lmawa http://dailyjs.com/tags.html#lmawa )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)