【发布时间】: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