正如我在回答您之前的问题时提到的,我是 P'unk Avenue 的 Apostrophe 的主要建筑师。
在我们的演示项目中实际上有一个完整的自动登录实现,可以借用(:我们希望自动登录用户,这样人们甚至在看到用户界面之前就不会放弃。
它很短,所以这里是:
module.exports = {
construct: function(self, options) {
self.pageBeforeSend = function(req, callback) {
if (!req.cookies.demo_autologin) {
return self.apos.users.find(req, { username: 'admin' }).permission(false).toObject(function(err, user) {
if (err) {
return callback(err);
}
if (!user) {
return callback(null);
}
req.login(user, function(err) {
if (err) {
return callback(err);
}
// Start a whole new request, but logged in. After this they
// have the cookie so they can log out and back in normally if they want
req.res.cookie('demo_autologin', 1);
return req.res.redirect('/');
});
});
}
return callback(null);
};
}
};
当然,您需要通过将其与其余部分一起包含在属性demo-autologin
中来启用该模块。app.js
modules
以下是该模块的工作原理:
它提供了一个pageBeforeSend
方法,该方法在页面发送到浏览器之前被调用。
它检查demo_autologin
cookie 是否已经设置。
如果没有,它通过模块方法admin
提供的光标找到用户,使用绕过通常会限制可以找到的权限检查。find
apostrophe-users
permission(false)
它调用req.login
,提供的一种方法passport
使得以编程方式登录用户变得非常容易。
它通过设置 cookie req.res.cookie
。res
对象总是可以被访问,反之亦然req
。在撇号req
中,通常只传递,因为req.res
它是可用的,并且因为在大多数情况下,您将向 中添加更多数据req
,而不是直接响应。
它重定向到主页,以便整个页面作为登录体验加载。
当然,您会根据不同的标准来决定寻找哪个用户,而不是“让每个人都成为管理员”,但听起来您已经掌握了这部分,并且此代码应该很容易适应您的需求。
(在我看来,如果用户甚至拒绝接受一个普通的旧会话 cookie,这段代码可能会遇到重定向循环。常规登录无论如何都不起作用,但如果你愿意,你可以通过查询字符串跟踪情况并告诉用户如果他们两次到达这里就启用 cookie。)
此答案已更正以包含 的req
论点find
。