当前位置: 首页 > 知识库问答 >
问题:

多租户MongoDB mongo本机驱动程序连接池

越朗
2023-03-14

我们正在尝试使用nodejs/mongo原生驱动程序实现下面演示(幻灯片13-18)中概述的策略。

https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application

总结:

  • 从node.js.创建到mongoDB的连接池
  • 对于租户的每个请求,从池中获取一个连接并对其进行“身份验证”。使用经过身份验证的连接来服务请求。响应后,将连接返回到池中。

我可以使用mongo本机驱动程序创建到mongodb的连接池,而无需指定任何数据库,如下所示:

const Client=new MongoClient('mongodb://localhost:27017',{useNewUrlParser: true, poolSize: 10});

但是,为了获得db对象,我需要执行以下操作:

const db=client。db(dbName)

这是我想要验证连接的地方,而且它已经被弃用/从最近的mongo驱动程序节点中删除。js和java。

从演示文稿来看,这似乎与旧版本的Java驱动程序有关。

我是否可以使用单个连接池并使用相同的连接对单个数据库的租户进行身份验证?

我们的另一种选择是每个租户都有一个连接池,这在目前对我们没有吸引力。

任何帮助都将不胜感激,包括不推荐/删除此功能的原因。


共有1个答案

益绯辞
2023-03-14

是幻灯片上的我!!:)我记得那次会议,很有趣。

是的,这已经不起作用了,他们在我们实现它6个月后就终止了这项伟大的功能,当时我们正在测试阶段。我们必须改变工作方式。。

令人遗憾的是,直到今天,在Mongo中,“连接”(网络内容、SSL、群集标识)和身份验证是两个独立的操作。考虑一下,当您运行mongo shell时,您提供了主机、端口、副本集(如果有),以及您的in连接!但未经认证。然后,您可以向user1进行身份验证,然后再向user2进行身份验证,并执行只有user2才能执行的操作。这是在同一个连接上完成的!无需再次创建通道、SSL握手等开销。。。

当时,驱动程序让我们拥有一个“空白”连接的连接池,我们可以在当前执行线程的上下文中随意对当前租户进行身份验证。

然后他们弃用了这个功能,我想是在Mongo 2.4中。现在他们只支持在创建时经过身份验证的连接。我们询问了企业支持,他们没有说为什么,但在我看来,他们发现这种方式不安全,“旧”身份验证可能会泄露,停留在“不那么空白”的可重用连接上。

我们对多租户infra实现进行了更改,从一个大的空白连接池更改为多个(小的)经过身份验证的连接池,每个租户一个池。每个租户的这些池可能非常小,比如3个或5个连接。这个解决方案可以很好地扩展到数百个租户,但为了满足数千个租户的需求,我们必须进行各种优化,以根据需要创建池,在空闲时间后关闭池,为非活动或Hibernate租户延迟创建池,等等。这使我们可以扩展得更多。。。我们仍在研究解决方案和优化。

您始终可以返回到具有多个数据库访问权限的Mongo用户的全局身份验证连接池。是的,您可以在同一个经过身份验证的连接上切换数据库。您只是不能切换身份验证...这是纯MongoJava驱动程序的示例,我们使用了提供类似功能的Spring:

MongoClient mongoClient = new MongoClient();
DB cust1db = mongoClient.getDB("cust1");
cust1db.get...
DB cust2db = mongoClient.getDB("cust2");
cust2db.get...

有点相关,我建议在rest中查看MongoDB加密,这是一个企业特性。根据不同密钥加密每个数据库(每个客户)的唯一方法。

 类似资料:
  • 在nodejs中,根据每个请求打开mongodb连接,然后在回调中关闭它是一种好做法吗? 有人说,没有必要在每个请求上打开/关闭mongodb连接,因为一旦打开,就可以共享一个连接池。 问题是如何维护和共享该池?猫鼬已经自动做到了吗? 尤其是在mongodb超时或断开连接时,是否需要重新连接? 我在这里发现了相互矛盾的答案:是否根据请求关闭mongodb连接 我读到的几乎所有在线doc nodej

  • 这是我在运行上述程序时遇到的错误。有人解决了这个问题吗? 我尝试过改变Selenium和ChromeDriver的版本,但没有任何效果。

  • 我正在使用Spring 2. x、Hibernate 5. x、Spring Data REST、Mysql 5.7构建一个多租户REST服务器应用程序。Spring 2. x使用Hikari进行连池。 我将使用每个租户数据库的方法,这样每个租户都有自己的数据库。 我以这种方式创建了我的MultiTenantConnectionProvider: 在我的实现中,我阅读了tenantId,并从中央管

  • 我的问题类似于问题多租户应用程序-OneDrive业务API 但我想让我的应用程序从其他不同azure订阅的租户那里访问一个驱动器,有可能吗?我明白,如果我注册我的应用程序并将其标记为多租户,它将允许我在azure订阅中访问租户,但如果我想使用相同的应用程序但在不同的azure订阅中访问租户,怎么办。

  • 问题内容: 我目前正在为大学的一个班级做项目。我正在学习有关连接和操作数据库的信息,我们正在使用Microsoft .accdb文件。 这是我到目前为止所拥有的。 当寻找“ sun.jdbc.odbc.JdbcOdbcDriver”时,我得到以下输出。 似乎很容易解决。看来我想念司机或类似的东西。但是,我很难找到解决方法。JDK随附驱动程序吗?我需要单独下载吗?是否取决于我的操作系统?(Mac O

  • 我试图理解Datastax Cassandra驱动程序中的连池,因此我可以更好地在我的Web服务中使用它。 我有留档的1.0版。它说: Java驱动程序异步使用连接,因此可以在同一个连接上同时提交多个请求。 他们通过连接理解什么?当连接到集群时,我们有:一个生成器、一个集群和一个会话。他们中的哪一个是连接? 例如,有一个参数: MaxSimultaneousRecestsPerConnection