【问题标题】:Making Meteor method calls synchronous on the client使 Meteor 方法调用在客户端同步
【发布时间】:2017-11-19 19:05:24
【问题描述】:

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

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

似乎有三种方法可以处理这个问题,没有一个像布尔函数那么简单:

  1. 从 isAdmin() 返回一个 Observable,但这会将问题排除在外 到调用 isAdmin() 的地方。它不能解决路由器保护问题。
  2. 在需要 isAdmin() 的地方执行 Meteor.call(),丢弃 isAdmin() 函数。这也将问题推向了所有的电话 站点,并且不解决路由器保护问题。
  3. 根本不返回值,而是让服务器端方法抛出 如果用户不是管理员,则例外。但是,这不会改变方法调用的异步性质。

我见过使用 Meteor.wrapAsync 或 Future 的示例,但这些使用的是服务器上的 Fiber,而不是客户端。

对其他模式的任何其他建议,也许使用 rxjs?谢谢。

【问题讨论】:

    标签: javascript asynchronous meteor synchronization rxjs


    【解决方案1】:

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

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

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

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

    但在该页面上,我们可能会访问仅限管理员的数据。由于我们在服务器上处理发布,因此我们可以检查这些管理员角色是否真实,我们可以检测到非管理员用户访问并引发错误。

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

    对于您关于“检查角色的客户端代码是什么样的?”的问题,它实际上只是查询 Meteor.user 上“角色”字段的内容。因此,虽然它确实向他们暗示了存在哪些角色以及应用程序如何使用它们以获得可见性,但恕我直言,它并没有提供恶作剧的途径。只要他们不能访问任何受限数据,或成功执行任何受限调用,它就是安全的。

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

    【讨论】:

    • Zim 的许多优点。我只想补充一点,在调试器中可以很容易地绕过对服务器进行管理员状态的同步调用。受保护页面的 布局 包含在发送给客户端的捆绑包中,没有可靠的方法来隐藏它们。防止通过出版物中的服务器端控件将任何 数据 加载到这些布局中是正常模式。不过还有一种替代方法,就是将管理功能分离到一个单独的 Meteor 应用程序 绑定到同一个 mongodb。
    • @MichelFloyd,是的,如果保护管理模板本身很重要,那么单独的应用程序或模块加载(我在其他框架中完成但不是 Meteor)都是很好的解决方案。但是你能说更多关于调试器规避的信息吗?我没有关注。
    • 假设客户端对服务器进行同步调用以决定是否允许逻辑继续进行(例如使用.wrapAsync())。在调试器中找到该代码,在客户端 js 调试器中设置断点,等待值返回,然后以交互方式更改它,使其通过测试,继续路由。
    • @zim,感谢 cmets。过滤发布的数据似乎是最好的方法,尽管我还不相信发布决定完全取决于服务器。用户请求肯定会影响这一点,但也许我只需要创建更多原型。
    • 在这一切中我的一些挫败感是我们也在使用 alanning:roles。但无论是我自己的错误还是其他原因,由于角色集合中没有数据,在客户端检查角色失败。我添加了自己的角色订阅并尝试了其他方法。在花了很多时间试图让事情正常工作(使用 Meteor1.5./Angular 4)之后,我在这里发布了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多