Sails.js SailsJS:在定义的express中间件之前添加一个中间件进行调试
一般问题 Sails JS基于express JS构建,出于调试原因,我想在cookieParser/bodyParser之前在Sails JS中插入中间件或函数,我希望Sails JS包装如下: 使用(cookieParser()); app.use(bodyParser()); 等等 在这些注入之前,我想注入我自己的中间件功能,我该怎么做?例如,为了跟踪初始请求 具体问题: 我集成了Passport JS,请求中包含敏感用户信息(见下文),我很确定这是由于cookieParser/bodyParser等请求解析中间件造成的,但我想知道如何亲自确认这一点 (我也很高兴得到您的确认) 当我打印请求时,用户信息就在那里,特别是密码(“密码:'$2a$10$RFRPTIM7O1BKD1QDR7YPUEWVISEHYZICDD0EBIVLAM8PPVRUICES',”) 以下是部分请求: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
_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());
});
}
));