在客户端上使Meteor方法调用同步

时间:2017-06-16 22:27:58

标签: javascript asynchronous meteor synchronization rxjs

我觉得我错过了什么。我试图定制我的产品UI,以便仅为管理员显示某些项目。此外,限制对路由器中某些“页面”的访问需要同步呼叫保护。我当然更喜欢保持异步,但这似乎不符合要求。

在其他环境中,我会创建一个像isAdmin()这样的布尔函数来检查用户授权/角色。但由于出于安全原因,用户不应该看到该功能的实现,因此最好使用仅服务器的Meteor方法。虽然该方法可以在客户端上同步(如果没有指定回调),获取返回值的唯一方法是使用Meteor.call()的异步回调形式。

似乎有三种方法可以解决这个问题,其中没有一种方法像布尔函数一样简单:

  1. 从isAdmin()返回一个Observable,但这会将问题推迟 到任何调用isAdmin()的地方。它无法解决路由器防护问题。
  2. 在需要isAdmin()的地方做一个Meteor.call(),丢弃 isAdmin()函数。这也将问题推到了所有的电话 站点,并没有解决路由器守卫。
  3. 根本不返回值,但抛出服务器端方法 如果用户不是管理员,则为例外。但是,这不会改变方法调用的异步性质。
  4. 我见过使用Meteor.wrapAsync或Future的例子,但这些例子在服务器上使用Fibers,而不是客户端。

    对其他模式的任何其他建议,可能使用rxjs?感谢。

1 个答案:

答案 0 :(得分:2)

我认为我不了解您的整体安全策略,但这里有几点需要考虑。

安全性发生在服务器上,看起来你很清楚。

在我当前的项目中,我们使用角色(alanning:roles),并拥有多个管理员角色。这些角色是使用Meteor.user对象发布的,因此在客户端上我们可以通过检查来启用/禁用页面链接。

所以我们同意这样做不是真正的安全性,因为用户可以简单地导航到该链接或更改其客户端Meteor.user对象以公开它。

但在该页面上,我们可能会访问仅限管理员的数据。因为我们处理服务器上的发布,我们可以在那里检查真实的管理员角色,我们可以检测到非管理员用户访问并抛出错误。

同样,如果我们向用户发布数据,并且他们获得的项目基于角色,我们可以在发布中检查并仅发布他们允许查看的项目。同样的想法,限制那些已发表项目的字段。

关于“查看角色的客户端代码是什么样的?”的问题,它实际上只是在查询Meteor.user上“roles”字段的内容。因此,虽然它确实给了他们一些角色存在的暗示以及应用程序如何使用它们来实现可见性,但它并没有提供恶作剧的途径。

,只要他们无法访问任何受限制的数据,或成功执行任何受限制的呼叫,它就是安全的。

因此,对于我们的每个发布者和Meteor方法,我们都有大量的错误检查,包括角色(管理员和其他)。如果有什么不排队,我们就会抛出一个错误。