0

我有一个包含一些拒绝更新规则的用户集合:

// The roles object
Schema.roles = new SimpleSchema({
    maker: {
        type: Boolean,
        denyUpdate: true
    },
    admin: {
        type: Boolean,
        denyUpdate: true
    }
});

这些数据在用户配置文件中。显然,我不希望随机用户能够修改profile.roles.admin. 但是管理员用户应该可以。

它部分工作:用户无法修改此布尔值。但是应该可以从以下服务器端代码修改它。

Meteor.users.update({_id: targetID'}, {$set: {'profile.roles.admin': true}});

有没有办法告诉collection2信任来自服务器的代码?


编辑:答案


感谢下面的答案,这是我现在用于架构的代码:

admin: {
    type: Boolean,
    autoValue: function() {
        // If the code is not from the server (isFromTrustedCode)
        // unset the update
        if(!this.isFromTrustedCode)
            this.unset();
    }
}

isFromTrustedCode布尔值告诉代码是否应该被信任。简单的。顺便说一句,该autoValue选项返回有关更新(或插入或设置或更新)操作的完整对象。以下是参数:

isSet: true
unset: [Function]
value: true
operator: '$set'
field: [Function]
siblingField: [Function]
isInsert: false
isUpdate: true
isUpsert: false
userId: null
isFromTrustedCode: true

因此,可以对写作权限规则进行真正细粒度的管理。

4

1 回答 1

1

正如官方文档中所提供的,您可以使用一个简单的选项绕过验证:

要跳过验证,请validate: false在调用insert或时使用该选项update。在客户端(不受信任的代码)上,这将仅跳过客户端验证。在服务器(可信代码)上,它将跳过所有验证。

但是,如果您想要更细粒度的控制,而不是使用 a denyUpdate,您可以使用具有上下文的custom验证类型,该this上下文具有在服务器上调用时的isFromTrustedCode属性。true

于 2014-08-11T19:06:10.247 回答