Sails.js SailsJS:在定义的express中间件之前添加一个中间件进行调试

Sails.js SailsJS:在定义的express中间件之前添加一个中间件进行调试,sails.js,Sails.js,一般问题 Sails JS基于express JS构建,出于调试原因,我想在cookieParser/bodyParser之前在Sails JS中插入中间件或函数,我希望Sails JS包装如下: 使用(cookieParser()); app.use(bodyParser()); 等等 在这些注入之前,我想注入我自己的中间件功能,我该怎么做?例如,为了跟踪初始请求 具体问题: 我集成了Passport JS,请求中包含敏感用户信息(见下文),我很确定这是由于cookieParser/bodyP

一般问题

Sails JS基于express JS构建,出于调试原因,我想在cookieParser/bodyParser之前在Sails JS中插入中间件或函数,我希望Sails JS包装如下:

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

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

具体问题:

我集成了Passport JS,请求中包含敏感用户信息(见下文),我很确定这是由于cookieParser/bodyParser等请求解析中间件造成的,但我想知道如何亲自确认这一点

(我也很高兴得到您的确认)

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

以下是部分请求:

    _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' },
在模型中,我使用了toJSON并删除了密码:

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

对于Sails v0.10,可以按照中的过程在主体解析器之前插入自定义中间件。在v0.9.x中,您必须创建自己的bodyParser回调并在其中添加中间件;有关更多信息,请参阅


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

1.一般问题

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

对于Sails 0.10.x,您可以在
config/express.js
中定义自定义
loadMiddleware
函数(默认实现在
Sails/lib/hooks/http/loadMiddleware.js
中)。斯科特·格雷斯对此进行了详细解释

2.具体问题

如果不希望请求对象包含密码信息,请在
反序列化用户的回调函数中调用
toJSON()

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());
      });
    }
));