6

我有一个删除了自动发布的 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);
  }
});
4

2 回答 2

1

您是否确保将 Meteor.users.allow 代码放入服务器?

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

于 2014-11-27T16:50:24.667 回答
0

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

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

ok = ->
  true

Agents.allow
  insert: ok 
  update: ok
  remove: ok  # authorize.authorsAndAdmins
于 2013-09-17T02:40:50.727 回答