在Meteor中保护用户电子邮件

时间:2013-11-09 14:35:50

标签: security collections meteor

我有一个用户列表。我不想将所有用户数据发布到客户端,尤其是电子邮件。我有多种发布方法可以使用:

Meteor.publish('usersData', function() {
    return Users.find({}, {
        fields: {
            emails: 0
        }
    });
});

但是,如果我或其他程序员忘记过滤字段并只发布整个集合,该怎么办:

Meteor.publish('users', function() {
    return Users.find();
});

这是一个问题。应该有全局设置来过滤集合中的数据。在当前(0.6.6.3)Meteor中有什么方法可以做到吗?

2 个答案:

答案 0 :(得分:0)

您可以创建一个使用的方法,而不是在发布用户所需的任何位置使用的普通collection.find方法。一个例子可能是:

function findUsers(query) {
    return Meteor.users.find(query || {}, { fields: { emails: 0 } });
}

然后你可以提醒你的程序员使用findUsers方法:

Meteor.publish('userData', function () {
    return findUsers({ points: { $gt: 5 } });
});

答案 1 :(得分:0)

如果发布了存在电子邮件字段的用户,则会编写一个抛出异常的集合观察器。

观察者为每个连接的用户独立运行,并在每次将用户对象推送到用户集合时触发。如果它不是当前用户,则在对象包含电子邮件字段时抛出错误。

您的团队应该在开发过程中注意到这些异常。

Meteor.publish("userCheck", function () {
  var self = this;

  var handle = Meteor.users.find({}).observeChanges({
    added: function(id) {
      var user = Meteor.users.findOne({_id: id});
      if (user.emails && self.userId !== id) {
        throw new Meteor.Error(500, "Must not publish other people's email!");
      }
    }
  });

  self.ready();

  self.onStop(function () {
    handle.stop();
  });
});