如何创建仅针对服务器安全敏感信息(客户端无法订阅)的流星主题



流星pub/sub机制是在服务器上跨包共享信息的绝佳方式,而无需与其他包共享包实现细节。

我想对安全敏感的数据使用发布/订阅机制。此敏感主题只能由不同的服务器组件发布和订阅。即客户不能订阅敏感话题。

由于恶意用户可以更改客户端代码,因此服务器必须明确阻止客户端成功订阅敏感主题。

如何将主题设为服务器专用?

更新(针对@alanning):

为什么我喜欢pub/sub(部分列表):

  1. pub/sub是减少大型项目中耦合的一种简单方法。包/模块/任何不知道谁在处理它们的输出或请求(或在哪里)的东西-重构很容易,因为唯一的入口点在主题级别,而不是代码级别
  2. pub/sub允许在不同的VM上处理请求,而无需特殊的编码更改
  3. pub/sub提供了一种简单的方法,可以在服务器处于高负载时将某些类型的请求路由到/dev/null
  4. 易于测试的模拟点
  5. 数据生成器不需要知道数据是如何使用的
  6. 1-N个消费者,而生产者不知道多个消费者

流星内:

我希望能够使用流星酒吧/酒吧机制,因为:

  1. 重用代码非常棒
  2. 流星酒吧/酒吧有德普机制(真棒^2)
  3. 流星酒吧/酒吧包括传输机制(服务器到服务器的通信是免费的吗?)
  4. 流星团队正在增强它——所以我没有——嘿,我很懒
  5. 运行其他技术的其他服务器也可以加入进来。(apachesolr,hadoop?)

但悲伤:

  1. 客户端不安全
  2. 某些主题需要进行身份验证
  3. 有些主题是服务器内部的,所以不需要为传输打包数据的开销

Meteor.subscribe仅在客户端可用,而在服务器上不可用
http://docs.meteor.com/#meteor_subscribe

-更新2-

同一进程内代码之间的消息传递

Nodejs提供了EventEmitter,它允许设置自定义事件。导入"events"包和"util"包以设置继承,如下所示:

util.inherits(MyQueue, EventEmitter);

以下是如何导入这些npm包:

Meteor封装中的Npm.require('events')
  • Meteor.require('events')在使用npm陨石包的Meteor应用中
  • 下面是一个使用它来侦听redis队列的示例。设置自己的队列主要是关于发布和收听哪些事件的约定

    -更新1-

    在不同进程中运行的代码之间传递消息

    pub/sub队列绝对是一个不错的选择,您有几种方法可以实现这一点。我想到了两个:

    • 使用Mongo集合实现穷人队列
    • 使用第三方消息队列,如RabbitMQ

    Mongo集合

    根据您的需求,使用Mongo是可能的。快速搜索会带来几个实现和设计讨论(主要是Ruby):https://www.google.com/search?q=pubsub+用+mongo排队。小心点,不过。。。从长远来看,这可能会成为更多的工作。取决于您需要什么功能。

    第三方消息队列

    实际的队列解决方案提供了启用分布式消息传递的最佳方式。您可以设置一个RabbitMQ集群,Meteor进程与该集群交互以分发工作。提供良好的好处,如高可用性和有保证的交付。此外,工人不必是nodejs进程;任何AMPQ客户端都可以接收任务。

    我使用Accounts系统来完成此操作。在服务器上,我创建了一个管理员帐户,并向其添加了一个admin : true属性(在配置文件之外,因此它不可由用户更改)。

    我的Meteor.publish代码检查this.userId,在此id上执行Meteor.users查找,并确保存在admin : true属性。如果找不到此属性,则返回一个空游标。

    虽然从技术上讲,客户端可以订阅,但只需设法获得管理员帐户的用户名/密码。这样做的好处是不涉及任何黑客代码。

    最新更新