【问题标题】:secure user email in MeteorMeteor 中的安全用户电子邮件
【发布时间】:2013-11-21 12:47:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: security collections meteor


    【解决方案1】:

    如何编写一个集合观察器,只要发布了具有电子邮件字段的用户,就会引发异常。

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

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

    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();
      });
    });
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 是的,我做过类似的事情,但我忘了使用它!我不小心用电子邮件发布了用户数据,只是因为我忘记使用我的函数......我需要 Users.find() 默认情况下始终返回没有某些字段的数据 - 全局。当我需要用户电子邮件时,应该可以将其关闭。
      • @TomášHromník 好吧,别忘了使用它!应该不是很难,真的。如果您需要能够将其关闭,只需检查您的代码,搜索“users.find”,并确保您过滤掉了电子邮件......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      相关资源
      最近更新 更多