我正在构建一个包含用户登录的Sails.js应用程序。正如文档所指示的那样,当用户登录时,会话会在会话中相应地记录她的ID:
req.session.userId = createdUser.id;
在大多数示例中,每个路由都会对此ID执行查找(如果存在),并将已通过身份验证的用户发送到视图(如果找到)。这让我觉得非常低效。每个视图都需要知道是否有登录用户才能在左上角显示她的名字。因此,如果我理解正确,每个视图都包括访问数据库以查找用户,即使我通过创建为每个路由执行此查找的策略来减少代码量。
我宁愿做的是在会话中记录用户的信息,这样一旦她通过身份验证,该信息就会自动出现在每个视图中:
req.session.userId = createdUser.id;
createdUser.loggedIn = true;
req.session.user = createdUser;
// the createdUser object does NOT contain the encrypted password or other sensitive info
这样我就可以从layout
父模板(以及任何子模板)中为登录用户签入模板。 (我正在使用服务器端视图。)
{% if (session.user && session.user.loggedIn) %}
<li><a href="/profile/{{ session.user.id }}">Hi there, {{ session.user.username }}</a></li>
{% else %}
<li><a href="/signin">Sign In (if you want)</a></li>
{% endif %}
我的问题是这是否会带来任何形式的安全风险。它似乎比在每个视图中查找用户更有效,但也许文档似乎建议这样做的原因?
答案 0 :(得分:2)
在大多数示例中,每个路由都会对此ID执行查找 它存在,并将经过身份验证的用户发送到视图(如果找到)
仅供参考,理想情况下,这应由政策处理。
这让我觉得非常低效。每个视图都需要知道是否 有一个已登录的用户,以便在上方显示她的名字 左角。所以,如果我理解正确,每个观点都包含一次旅行 用于查找用户的数据库,即使我减少了代码量 通过创建一个为每条路径执行此查找的策略。
要么对数据库进行额外的往返,要么膨胀会话。两者都有其优点和缺点。例如。在创建不需要扩展的后端应用程序时,我不关心这些额外的数据库查找。但是,当我有数十万用户时,我应该关心。在构建应用程序时,您必须考虑这一点。需要扩展的应用程序,例如使用例如redis作为优化会话存储。
所以回答你的问题,是的,可以在会话对象中存储用户名等,以避免额外的数据库查找。我不是安全专家,但我不建议在会话中存储任何敏感的用户信息,如密码。
BTW我强烈建议使用http://passportjs.org/。它与帆很好地结合在一起。
为了帮助您入门:
在此示例中,您可以看到用户名,电子邮件和用户角色如何存储在会话对象中:
passport.serializeUser(function(user, done) {
var sessionUser = { _id: user._id, name: user.name, email: user.email, roles: user.roles }
done(null, sessionUser);
});