可以安全地在与Sails.js的会话中存储完整的用户信息吗?

时间:2016-09-06 04:21:27

标签: session model-view-controller sails.js

我正在构建一个包含用户登录的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 %}

我的问题是这是否会带来任何形式的安全风险。它似乎比在每个视图中查找用户更有效,但也许文档似乎建议这样做的原因?

1 个答案:

答案 0 :(得分:2)

  

在大多数示例中,每个路由都会对此ID执行查找   它存在,并将经过身份验证的用户发送到视图(如果找到)

仅供参考,理想情况下,这应由政策处理。

  

这让我觉得非常低效。每个视图都需要知道是否   有一个已登录的用户,以便在上方显示她的名字   左角。所以,如果我理解正确,每个观点都包含一次旅行   用于查找用户的数据库,即使我减少了代码量   通过创建一个为每条路径执行此查找的策略。

要么对数据库进行额外的往返,要么膨胀会话。两者都有其优点和缺点。例如。在创建不需要扩展的后端应用程序时,我不关心这些额外的数据库查找。但是,当我有数十万用户时,我应该关心。在构建应用程序时,您必须考虑这一点。需要扩展的应用程序,例如使用例如redis作为优化会话存储。

所以回答你的问题,是的,可以在会话对象中存储用户名等,以避免额外的数据库查找。我不是安全专家,但我不建议在会话中存储任何敏感的用户信息,如密码。

BTW我强烈建议使用http://passportjs.org/。它与帆很好地结合在一起。

为了帮助您入门:

  1. http://iliketomatoes.com/implement-passport-js-authentication-with-sails-js-0-10-2/
  2. https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive
  3. 在此示例中,您可以看到用户名,电子邮件和用户角色如何存储在会话对象中:

    passport.serializeUser(function(user, done) {
        var sessionUser = { _id: user._id, name: user.name, email: user.email, roles: user.roles }
        done(null, sessionUser);
    });