Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使Meteor方法调用在客户端上同步_Javascript_Asynchronous_Meteor_Synchronization_Rxjs - Fatal编程技术网

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

Javascript 使Meteor方法调用在客户端上同步,javascript,asynchronous,meteor,synchronization,rxjs,Javascript,Asynchronous,Meteor,Synchronization,Rxjs,我觉得我错过了什么。我试图定制我的产品UI,以便某些项目只显示给管理员。此外,限制对路由器中某些“页面”的访问需要同步呼叫保护。我当然希望保持异步,但这似乎不符合要求 在其他环境中,我会创建一个类似isAdmin()的布尔函数来检查用户授权/角色。但由于出于安全原因,用户不应该看到该功能的实现,因此最好使用仅限服务器的Meteor方法。虽然该方法在客户端上可以是同步的(如果没有指定回调),但是获取返回值的唯一方法是使用Meteor.call()的异步回调形式 似乎有三种方法可以处理这个问题,但没

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

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

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

  • 从isAdmin()返回一个Observable,但这将解决问题 到调用isAdmin()的任何位置。它不能解决路由器防护问题
  • 在需要isAdmin()的地方执行Meteor.call(),丢弃 isAdmin()函数。这也会将问题推到所有呼叫 站点,并且不寻址路由器防护
  • 根本不返回值,但让服务器端方法抛出 如果用户不是管理员,则为异常。但是,这不会改变方法调用的异步性质
  • 我见过使用Meteor.wrapAsync或Future的示例,但这些示例使用服务器上的光纤,而不是客户端


    对于其他模式,可能使用rxjs,还有其他建议吗?谢谢。

    我想我不了解您的总体安全策略,但这里有几件事需要考虑

    安全性发生在服务器上,看起来您很清楚这一点

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

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

    但在那个页面上,我们可能只访问管理员数据。由于我们在服务器上处理发布,在服务器上我们可以真正检查那些管理员角色,因此我们可以检测非管理员用户访问并抛出错误

    类似地,如果我们将数据发布给用户,并且他们获取的项目基于角色,那么我们可以在发布中检查,并仅发布他们允许查看的项目。在那些已发布的项目上限制字段也是这样

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


    因此,对于我们的每个发布者和Meteor方法,我们都有大量的错误检查,包括角色(admin和其他)。如果有任何不一致的地方,我们就会抛出一个错误。

    我想我不理解您的总体安全策略,但这里有一些事情需要考虑

    安全性发生在服务器上,看起来您很清楚这一点

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

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

    但在那个页面上,我们可能只访问管理员数据。由于我们在服务器上处理发布,在服务器上我们可以真正检查那些管理员角色,因此我们可以检测非管理员用户访问并抛出错误

    类似地,如果我们将数据发布给用户,并且他们获取的项目基于角色,那么我们可以在发布中检查,并仅发布他们允许查看的项目。在那些已发布的项目上限制字段也是这样

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


    因此,对于我们的每个发布者和Meteor方法,我们都有大量的错误检查,包括角色(admin和其他)。如果有任何不一致的地方,我们就会抛出一个错误。

    Zim有很多优点。我只想补充一点,在调试器中可以很容易地绕过对服务器进行管理状态的同步调用。受保护页面的布局包含在发送到客户端的包中,没有可靠的方法隐藏这些页面。防止任何数据通过发布中的服务器端控件加载到这些布局中是正常模式。还有一个替代方案,就是将管理功能分离到一个单独的Meteor应用程序中,该应用程序绑定到同一个mongodb。@MichelFloyd,是的,如果保护管理模板本身很重要,那么单独的应用程序或模块加载(我在其他框架中做过,但不是Meteor)都是很好的解决方案。但是你能说更多关于调试器规避的内容吗?我没有遵循。假设客户端向服务器发出同步调用,以决定是否允许逻辑继续(例如使用
    .wrapAsync()
    )。在调试器中找到该代码,在客户端js调试器中设置断点,等待该值返回,然后在