【问题标题】:Remove records by userId not allowed不允许按 userId 删除记录
【发布时间】:2014-06-12 13:40:29
【问题描述】:

在我的应用中,用户可以选择删除他的所有通知。作为事件处理程序,我有这个:

Template.clearNotifications.events({
  'click .clear-notifications': function() {
    Notifications.remove({userId: Meteor.user()._id});
  }
});

当它被调用时,我得到这个错误:

Uncaught Error: Not permitted. Untrusted code may only remove documents by ID. [403] 

这是我忘记添加的权限,还是通常不允许这样做?如果是这样,我有哪些选项可以删除用户的通知?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    在客户端,meteor 只允许按 id 删除文档。幸运的是,有一个简单的解决方案 - 只需遍历所有当前用户的通知并删除每个通知:

    Template.clearNotifications.events({
      'click .clear-notifications': function() {
        Notifications
          .find({userId: Meteor.userId()})
          .forEach(function(notification) {
            Notifications.remove(notification._id);
          });
      }
    });
    

    请记住,这只会删除客户端知道的通知(已发布的通知)。如果数据库中还有其他需要删除的通知(也许您只发布了 10 个最近的文档),您需要使用method。例如:

    Meteor.methods({
      removeAllNotifications: function() {
        Notifications.remove({userId: this.userId});
      }
    });
    

    您可以从客户端调用:

    Meteor.call('removeAllNotifications');
    

    【讨论】:

    • 谢谢戴夫,这正是我想要的。而且我没有意识到从客户端中删除只会删除已发布的!
    【解决方案2】:

    仅当您传递文档的 _id 时,才能在不受信任的区域(客户端)中删除:

    var notification = Notifications.findOne({userId:Meteor.userId()});
    Notifications.remove({_id:notification._id})
    

    解释:

    remove 的行为因受信任代码或不受信任代码调用而有所不同。可信代码包括服务器代码和方法代码。不受信任的代码包括客户端代码,例如事件处理程序和浏览器的 JavaScript 控制台。

    可信代码可以使用任意 Mongo 选择器来查找要删除的文档,并且可以通过传递匹配多个文档的选择器一次删除多个文档。它绕过由允许和拒绝设置的任何访问控制规则。如果不传递回调,remove 会返回删除的文档数。

    作为一项安全措施,如果选择器被省略(或未定义),则不会删除任何文档。如果您确实想从您的集合中移除所有文档,请将选择器设置为 {}。

    不受信任的代码一次只能删除一个文档,由其 _id 指定。只有在检查任何适用的允许和拒绝规则后才会删除该文档。删除的文档数将返回给回调。

    http://docs.meteor.com/#remove

    【讨论】:

    • 好的,但是如果我有多个通知,我该如何迭代它们?
    • 可信代码(服务器端)可以做到这一点。在服务器端创建方法,删除任意 Mongo 选择器选择的通知。
    猜你喜欢
    • 2016-07-28
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多