一般问题
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;
}
答案 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在cookieParser
,session
,bodyParser
和methodOverride
之后使用。要在cookieParser
和bodyParser
之前注入自定义中间件,您可以覆盖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());
});
}
));