【问题标题】:Node.js: whitelisting/redaction of database entriesNode.js:数据库条目的白名单/编辑
【发布时间】:2015-12-21 21:37:06
【问题描述】:

从节点,我访问一个带有类似对象的数据库

animals: [
{
  name: monkey,
  diet: banana,
  tame: false,
},
{
  name: donkey,
  diet: carrot,
  tame: true,
}
// [...]
]

我想将大部分数据的访问权限授予客户端,但请确保tame 属性公开。

使用节点和lodash's pick(),我可以以某种方式将数据列入白名单,例如,

// retrieve data
// [...]

// whitelist
return {
   name: _.pick(animal, 'name'),
   diet: _.pick(animal, 'diet'),
};

但这有点乏味,特别是如果键的选择取决于其他因素(例如,尝试访问数据的用户)。

什么是好的白名单/redaction 节点模式/模块?

【问题讨论】:

    标签: node.js mongodb mongoose access-control


    【解决方案1】:

    这在很大程度上取决于您使用的数据库。大多数数据库只允许您在查询本身中选择特定的列/字段。 MongoDB 也这样做。

    如果您使用猫鼬,您实际上可以针对每个模型强制执行此操作:

    function filter(document, animal) {
        delete animal.tame;
        return animal;
    };
    
    var options = {
        toJSON: {transform: filter},
        toObject: {transform: filter}
    };
    
    var animalSchema = new Schema({
           name: { type: String, trim: true, required: true },
           tame: { type: boolean, required: true },
           secret: { type: String, required: true, select: false }
        },options);
    
    
    var Animal = mongoose.model('Animal', animalSchema);
    
    var dog = new Animal({name:"rex", tame:true, secret:"rexrex"});
    
    dog.save();
    
    dog.toJSON(); // will not have "tame" property
    dog.toJSON({transform: filter}) // dynamic filter
    
    dog.toObject(); // will not have "tame" property
    
    Animal.findOne(); // result objects will not have "secret" property
    

    如您所见,您可以:

    1. 设置转换函数以在导出为 json 或对象时在文档上执行。
    2. select:false 标记一个字段,它不会出现在任何基于猫鼬模型的查询中。 (不过,您仍然可以进行自定义查询。)

    如果您正在处理大量对象,请考虑编写Transform Stream。然后你可以:

    Animal.find().stream().pipe(myTransformStream).pipe(clientResponse) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2017-12-04
      • 2013-07-03
      • 1970-01-01
      • 2011-11-13
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多