【问题标题】:Meteor.users.allow never fires, but Meteor.users.deny worksMeteor.users.allow 永远不会触发,但 Meteor.users.deny 有效
【发布时间】:2014-11-28 00:50:24
【问题描述】:

我有一个删除了自动发布的 Meteor 应用程序。

在这个应用程序中,我想允许管理员对任何用户进行 crud,但其他用户应该只能更新他们自己的。使用简单的 Meteor.users.allow,更新函数永远不会被调用(我可以说),但是如果我使用 Meteor.users.deny 并反转逻辑,它就可以正常工作。

我的应用程序中只有一个 Meteor.users.allow 函数。我可以忍受使用拒绝,但谁能告诉我允许我做错了什么?

我的允许函数,它从不记录任何内容:

console.log("Setting Meteor.users.allow");
Meteor.users.allow({
  insert: function (userId, doc) {
    // only admin can insert 
    var u = Meteor.users.findOne({_id:userId});
    return (u && u.isAdmin);
  },
  update: function (userId, doc, fields, modifier) {
    console.log("user "+userId+"wants to modify doc"+doc._id);
    if (userId && doc._id === userId) {
      console.log("user allowed to modify own account!");
      // user can modify own 
      return true;
    }
    // admin can modify any
    var u = Meteor.users.findOne({_id:userId});
    return (u && u.isAdmin);
  },
  remove: function (userId, doc) {
    // only admin can remove
    var u = Meteor.users.findOne({_id:userId});
    return (u && u.isAdmin);
  }
});

我的拒绝功能,它记录和工作:

console.log("Setting Meteor.users.deny");
Meteor.users.deny({
  insert: function (userId, doc) {
    // only admin can insert 
    var u = Meteor.users.findOne({_id:userId});
    return !(u && u.isAdmin);
  },
  update: function (userId, doc, fields, modifier) {
    console.log("user "+userId+"wants to modify doc"+doc._id);
    if (userId && doc._id === userId) {
      console.log("user allowed to modify own account!");
      // user can modify own 
      return false;
    }
    // admin can modify any
    var u = Meteor.users.findOne({_id:userId});
    return !(u && u.isAdmin);
  },
  remove: function (userId, doc) {
    // only admin can remove
    var u = Meteor.users.findOne({_id:userId});
    return !(u && u.isAdmin);
  }
});

【问题讨论】:

  • 您正在修改的数据是否在用户配置文件中?有一个默认允许允许任何客户端修改其自己的配置文件。是否已将失败的 doc._id 发布给 admin 用户?我想我在尝试更新未发布到该客户端的数据时也遇到了默认拒绝规则。
  • 这是非常危险的。如果我可以修改我的个人资料并将isAdmin 设置为true,我将成为管理员!您应该拒绝对字段 isAdmin! 的操作!

标签: javascript meteor


【解决方案1】:

您确定将 Meteor.users.allow 代码放入服务器吗?

我在客户端而不是服务器代码中使用允许时遇到了同样的问题。

【讨论】:

    【解决方案2】:

    第一个允许将其通过。喜欢或从句。大多数否认例程从不抱怨,所以它必须经历所有这些——也许最后一个会失败。现在,你可以说它可以在第一次拒绝时停止,但他们需要一些总是会被触发的东西,所以他们没有优化该代码。

    您确实需要一些更安全的代码版本:

    ok = ->
      true
    
    Agents.allow
      insert: ok 
      update: ok
      remove: ok  # authorize.authorsAndAdmins
    

    【讨论】:

    • 我应该说,即使没有拒绝功能,允许功能也不会触发。或者至少,我没有创造。隐藏的默认拒绝是否会覆盖我的允许?
    • 任何拒绝都会阻止允许,是的。另一个允许。您是否设置了权限并从流星包中删除了自动发布和不安全?喜欢:(糟糕的代码但很好的例子)ok = -> true Agents.allow 插入:ok 更新:ok 删除:ok # authorize.authorsAndAdmins
    • 您可能已经回答了我的问题,但我的速度还不够快。自动发布和不安全不在应用程序中。我的允许子句基本上就像你建议的那样,但它永远不会被击中,即使我没有拒绝。你能澄清你的 ok = -> 真实的例子吗?
    • 对不起,我最后的评论似乎是随机的!我现在怀疑 u.isAdmin 失败了,所以实际上是拒绝。快速测试:在拒绝中返回 false。您知道用户 rec 受到保护,并且您在其上设置的值需要显式添加?如果你不知道,我可以找到。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2021-05-22
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多