是否有可能确定一个 Meteor 方法是由服务器调用的?

9
我有一些 Meteor 方法,我想要保护它们,以便只有特定的用户才能从客户端调用它们。不过这些方法也被服务器使用。我通过this.userid传递了用户ID,因此我可以检查用户是否已登录并且是否允许进行调用,没问题。但是,当我需要从服务器端调用该方法时,如何确定它是服务器调用,以便允许该方法执行呢?检查是否存在this.userid以确定其是否为服务器调用会允许未经身份验证的用户调用该方法。我正在寻找一种确定该方法是否由服务器调用的方法,以便我可以允许它并仍然防止未经身份验证的用户调用该方法。
Meteor.methods({
  makeCoffee: function (time) {
    check(time, Number);
    if(calledByServer || (Meteor.user() && Meteor.user().profile.usertype === 'coffee dude')){
          //Makin' Coffee
    }
    else
      throw new Meteor.Error(404, "Can't find my pants");
    return "Coffee will be made at " + time;
  }

2
也许 makeCoffee 实际上是服务器上的一个函数。可以通过将其包装在检查 userId 的方法中来控制客户端访问。服务器调用总是直接进入函数。 - user728291
没错,这可能是我最终会使用的解决方案。但是我放弃了一些Meteor方法的优势,比如使用this.unblock()在不同的纤维中运行多个方法。 - Dsyko
2个回答

14

this.connection如果不是从客户端调用的话,将在服务器端方法中返回null

请参阅this.connection文档


有人找到了一个可以在从方法中调用的函数中工作的解决方案吗?现在,一旦进入任何函数,this.connection 将为 null(因为您正在为this进入另一个JS上下文)。 - neo post modern
1
为什么不使用 JavaScript 中一直使用的相同解决方案?在方法 var methodConn = this.connection 内部,然后您可以从回调函数中使用 methodConn - Charles Holbrow

4
看起来Meteor.call现在也可以从服务器端调用: http://docs.meteor.com/#meteor_call 将其修改为以下方式:
makeCoffee = function (time) { //code here }

Meteor.methods({
  makeCoffeeMethod: function (time) {
    if (calledByAllowedUser())
      return makeCoffee(time);
    else
      throw new Meteor.Error(403, 'Forbidden');
  }
});

现在你可以在服务器上调用它而不需要进行身份验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接