手动调用Collection.allow()以检查权限

时间:2014-05-25 15:27:48

标签: permissions meteor

在Meteor JS中我想在将对象添加到我的集合之前执行任务。所以我创建了自己的方法,例如:addObject,如此:

Meteor.methods({
    ...
    addObject: function(obj) {
        /*
        // this is what i'm trying to figure out...
        if ( !MyColl.allow('insert', Meteor.userId, obj) )
            throw Meteor.Error(403, 'Sorry');
        */

        MyColl.update({ ... }}, { 'multi': true });
        MyColl.insert(obj);
    },
    ...
});

但是我注意到.allow不再被调用,因为它已被信任"码。问题是该方法在服务器上但是从客户端调用(通过ObjectiveDDP)所以我仍然需要一种方法来验证客户端是否有权调用addObject - 有没有办法手动调用{{1从我的服务器代码集合?我尝试了但是得到了内部服务器错误,并且不确定语法应该是什么......在Meteor文档中找不到任何内容。

修改

我发现这有效:

.allow()

但这可能是一种禁止调用私有方法,例如_validators。有谁知道更多的最佳做法'方式是什么?

2 个答案:

答案 0 :(得分:0)

您可以在addobject方法中进行验证。例如,如果您只希望登录用户能够添加对象,则可以编写: if(!Meteor.user())抛出新的Meteor.Error(); 在addobject方法的开头。

我个人从不使用allow。

在相关的说明中,collection2和simple-schema包通常可以帮助验证。

答案 1 :(得分:0)

您使用的验证模式可能不是最好的做事方式。

如果你认为可以从客户端调用方法,你就不应该“破解”它做一些不应该做的事情。

如果您正在调用更改数据库中数据的方法,则应在该方法中检查当前登录用户是否有权这样做。

但是,你确定要这样做吗? Meteor还有Collection.allowCollection.deny方法,可用于定义读/写/更新/删除权限。这是处理权限的推荐方法,因此您所做的是反模式。但是,也许在你的情况下,这是绝对必要的?如果没有,您可能想重新考虑用例。

与其他回复一样,使用CollectionsSimpleSchema等内容来验证数据结构也是一个好主意。