我正在设置包含从用户接收到的密码的日志记录,并将该对象发布到后端,该密码是JSON对象中的密钥。
例如,
{
"username": my_username,
"password": my_password
}
我想在POST之前捕获该对象,但是不想记录密码值。有没有一种方法可以排除密码值的记录?
我正在constants.js
中创建JSON框架,如下所示
constants.js
const userDataObj = Object.freeze({
"username": null,
"occupation": null,
"password": null
})
module.exports = userDataObj;
然后在我的routes.js
中将其发布到后端。
firemanRoutes.js:
import userDataObj from '../../config/constants';
...
//initialize stuff in the constructor and set constants
constructor(socketProvider) {
super(socketProvider);
this.userDataObj = JSON.parse(JSON.stringify(userDataObj));
this.userDataObj.occupation = 'fireman';
}
// get the passphrase and post object
validate(res, user, passphrase) {
this.userDataObj.passphrase = passphrase;
// want to log object here **without** password
winston.info('Posting object: ' + this.userDataObj);
validateUser.post(user, this.userDataObj).then(() => {
if (!validateUser.getSuccess()) {
return super.handleErrors(res);
}
...
答案 0 :(得分:1)
您可以在保存之前从对象中剥离password
属性:
const safeObject = {
...this.userDataObj,
password: undefined // Or whatever value you want to use, eg "hidden", "removed", etc.
};
winston.info('Posting object: ' + safeObject);
这将创建一个浅表副本,然后覆盖password
属性。
这是一种确定哪些属性可以安全记录的“黑名单”方法-IE如果添加了不应记录的新属性,则需要明确覆盖它。
一种替代方法是“白名单”方法-即明确指出哪些属性可以安全记录:
const safeObject = {
this.userDataObj.username,
this.userDataObj.occupation,
this.userDataObj.passphrase
};
winston.info('Posting object: ' + safeObject);
这样做的好处是,如果您添加新属性,除非您明确声明,否则不会记录该属性。我之所以这样说是因为passphrase
属性当前正在被记录,但是我不确定这是有意还是无意。如果是偶然的,那么这种方法将可以避免此错误。
如果扩展运算符(...
)不可用,您可以使用Object.assign
获得相同的行为:
const safeObject = Object.assign({}, this.userDataObj);
safeObject.password = undefined;