SailsJS:在定义的快速中间件之前添加中间件以进行调试

时间:2014-03-23 09:49:05

标签: sails.js

一般问题

Sails JS是基于快速JS构建的,出于调试原因,我想在cookieParser / bodyParser之前在Sails JS中注入中间件或函数,我希望Sails JS包含以下内容:

app.use(cookieParser()); app.use(bodyParser()); 等...

我想在这些注射之前注入我自己的中间件功能,我该怎么做?例如,为了跟踪初始请求。

具体问题:

我与Passport JS集成,请求敏感用户信息(见下文),我很确定这是因为请求解析像cookieParser / bodyParser这样的中间件,但我想知道如何自己确认。

(我也很乐意收到您的确认)

当我打印请求时,用户信息就在那里,特别是密码(“密码:'$ 2a $ 10 $ rfRptIm7o1BKD1Qdr7yPUeWVisEHyZciCdD0ebivLAm8PPVRUicES',”)

以下是部分请求:

    _passport: 
    { instance: 
      { _key: 'passport',
        _strategies: [Object],
        _serializers: [Object],
        _deserializers: [Object],
        _infoTransformers: [],
        _framework: [Object],
        _userProperty: 'user',
        Authenticator: [Function: Authenticator],
        Passport: [Function: Authenticator],
        Strategy: [Object],
        strategies: [Object] },
     session: { user: '532ea818e6221c90251e9342' } },
    user: 
    { username: 'nizar',
     password: '$2a$10$rfRptIm7o1BKD1Qdr7yPUeWVisEHyZciCdD0ebivLAm8PPVRUicES',
     createdAt: Sun Mar 23 2014 11:23:36 GMT+0200 (Jerusalem Standard Time),
     updatedAt: Sun Mar 23 2014 11:23:36 GMT+0200 (Jerusalem Standard Time),
     id: '532ea818e6221c90251e9342' },

在模型I toJSON中删除了密码:

toJSON: function() {
  var obj = this.toObject();
  delete obj.password;
  return obj;
}

2 个答案:

答案 0 :(得分:1)

对于Sails v0.10,您可以按照this answer中的步骤在正文解析器之前插入自定义中间件。在v0.9.x中,您必须创建自己的bodyParser回调并在其中添加中间件;有关详细信息,请参阅this answer

但是在你的情况下,我不确定是否有必要这样做。为方便起见,Passport将用户数据添加到服务器上的请求对象,但它实际上并未在请求中传输。因此,没有敏感的数据在公开场合 - 它只是在内存中。您唯一关心的问题是不要将其发送回客户端,而您已使用toJSON模型上的User方法执行此操作。

答案 1 :(得分:1)

1.一般问题

对于Sails 0.9.x,sails服务器加载的middlware在sails/lib/express/index.js中定义。如您所见,config/express.js中定义的自定义middlware在cookieParsersessionbodyParsermethodOverride之后使用。要在cookieParserbodyParser之前注入自定义中间件,您可以覆盖cookieParser或直接修改sails/lib/express/index.js

对于Sails 0.10.x,您可以在loadMiddleware中定义自定义sails/lib/hooks/http/loadMiddleware.js函数(默认实现在config/express.js中)。 Scott Gress详细解释了这一点。

2.特定问题

如果您不希望请求对象包含密码信息,请在toJSON()的回调函数中调用deserializeUser

passport.deserializeUser(function(id, done) {
  User.findOneById(id).done(function(err, user) {
    done(err, user.toJSON());
  });
});

并在策略定义的回调函数中:

passport.use('local',
    new LocalStrategy({
      usernameField: 'userename',
      passwordField: 'password'
    },
    function(username, password, done) {
      User.findOne({ name: username}).done(function(err, user) {
        if (err) return done(err);

        if (!user) {
          return done(null, false, {message: 'Unknown user'+username});
        }; 

        if (!user.validatePassword(password)) {
          return done(null, false, {message: 'Invalid password!'});
        };

        return done(null, user.toJSON());
      });
    }
));