Sails JS:如何存储和访问当前用户数据?

时间:2017-03-17 18:19:26

标签: session sails.js jwt

我已经检查过很多参考资料,并找到了很好的资源,例如:Get current user from inside the model in Sails。所以我要求最佳实践和经验。

由于我已经开发了一个基于JWT-Authentication的非常复杂的平台,我必须解决在我的sails实例上存储当前用户数据(,而用户请求某些内容)的主要错误。 我知道这会导致严重的安全漏洞(针对多个用户)。

问题是:如何在不通过我创建的几乎所有方法传递会话对象的情况下存储和访问当前用户数据?

通过所有帮助程序,实用程序等传递会话对象是解决此问题的唯一方法吗?而不是像UserService.getCurrentUser();

那样使用集中式服务

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

如果你问是否有办法全球化用户数据,以便它可以神奇地用于你的所有方法,那么简短的答案是在Node中没有安全的方法(更不用说在Sails.js中)了。 Node的单线程特性使得无法以这种方式维护状态。

有些人使用globally-applied policy在Sails中解决了这个问题,hook https://github.com/detro/ghostdriver/pull/388会查找用户并将其添加到请求中:

// api/policies/fetch-user.js
module.exports = function fetchUserPolicy (req, res, next) {

  // Get the user ID  out of the session.
  var userId = req.session.userId;

  // If there's no user logged in, just continue.
  if (!userId) { return next(); }

  // Look up the user by ID.
  User.findOne({id: userId}).exec(function(err, user) {
    if (err) { return res.serverError(err); }
    if (!user) { return res.serverError(new Error('Could not find user in session!')); }

    // Add the user info to the request.
    req.user = user;

    // Continue the request.
    return next();  

  });

};

此代码没有任何问题,但我们不建议这样做,因为最佳做法是仅使用策略来实现访问控制。相反,您可以在自定义{{3}}中执行相同的操作:

// api/hooks/fetch-user.js
module.exports = function fetchUserHook(sails) {

  return {

    // Add some routes to the app.
    routes: {

      // Add these routes _before_ anything defined in `config/routes.js`.
      before: {

        // Add a route that will match everything (using skipAssets to...skip assets!)
        '/*': {
          fn: function(req, res, next) {

            // Get the user ID  out of the session.
            var userId = req.session.userId;

            // If there's no user logged in, just continue.
            if (!userId) { return next(); }

            // Look up the user by ID.
            User.findOne({id: userId}).exec(function(err, user) {
              if (err) { return res.serverError(err); }
              if (!user) { return res.serverError(new Error('Could not find user in session!')); }

              // Add the user info to the request.
              req.user = user;

              // Continue the request.
              return next();

            });
          },
          skipAssets: true
        }

      }
    }
  };
};

无论哪种方式,您仍然需要将req传递给任何想要使用所获取的用户信息的方法。