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

Permissions 手动调用Collection.allow()检查权限,permissions,meteor,Permissions,Meteor,在Meteor JS中,我想在将对象添加到集合之前执行一项任务。因此,我创建了自己的方法,例如:addObject,如下所示: 但我注意到,.allow不再被调用,因为它是受信任的代码。问题是该方法在服务器上,但通过ObjectiveDDP从客户端调用,因此我仍然需要一种方法来验证客户端是否有权调用addObject-是否有任何方法可以手动调用。允许从我的服务器代码中调用集合?我试过了,但是出现了一个内部服务器错误,不确定语法应该是什么。。。在流星文件里找不到任何东西 编辑: 我刚刚发现这是可行

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

但我注意到,.allow不再被调用,因为它是受信任的代码。问题是该方法在服务器上,但通过ObjectiveDDP从客户端调用,因此我仍然需要一种方法来验证客户端是否有权调用addObject-是否有任何方法可以手动调用。允许从我的服务器代码中调用集合?我试过了,但是出现了一个内部服务器错误,不确定语法应该是什么。。。在流星文件里找不到任何东西

编辑:

我刚刚发现这是可行的:

var allowedToInsert = MyColl._validators.insert.allow[0];
if (!allowedToInsert)
    throw new Meteor.Error(403, 'Invalid permissions.');

但这可能是一个禁止调用私有方法的方法,比如_验证器。有人知道更“最佳实践”的方法吗?

您可以使用addobject方法进行验证。例如,如果您只希望登录用户能够添加对象,则可以编写: 如果流星。用户抛出新流星。错误; 在addobject方法的开头

就我个人而言,我从不使用“允许”


另一方面,collection2和简单模式包通常对验证有很大帮助。

您使用的验证模式可能不是最好的方法

如果您假设可以从客户端调用方法,那么您不应该“黑客”它去做它不打算做的事情

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

但是,您确定要执行此操作吗?Meteor还有Collection.allow和Collection.deny方法,您可以使用这些方法定义读取/写入/更新/删除权限。这是处理权限的推荐方法,因此您所做的是反模式。然而,也许在你的情况下,这是严格必要的?如果没有,您可能需要重新考虑用例


正如另一个回应所建议的,使用Collections或SimpleSchema之类的工具来验证数据结构也是一个好主意。

请注意,由于Meteor仍处于测试阶段,访问私有元素通常是实现目标的最佳方式。主要的缺点是,在版本升级后,它们可能会停止工作。
var allowedToInsert = MyColl._validators.insert.allow[0];
if (!allowedToInsert)
    throw new Meteor.Error(403, 'Invalid permissions.');