【问题标题】:Safe to store complete user info in session with Sails.js?在使用 Sails.js 的会话中存储完整的用户信息是否安全?
【发布时间】:2017-01-13 09:58:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    顺便说一句,我强烈推荐使用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

    在这个例子中,您可以看到用户名、电子邮件和用户角色是如何存储在会话对象中的:

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

    【讨论】:

      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2012-10-14
      • 2010-12-28
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多