我在幻灯片上认出你了!:) 我记得那次会议,很有趣。
是的,这个功能已经不能用了,它们在Beta测试期间实施了六个月,之后就放弃了这个优秀的功能。我们不得不改变工作方式...
这很遗憾,因为直到今天,在Mongo中,“连接”(网络内容、SSL和集群识别)和身份验证是两个分开的动作。
想象一下当您运行mongo shell时,您提供主机、端口、副本集 (如果有), 然后您就可以连接上了!但还没有进行身份验证。然后您可以对user1进行身份验证,做一些事情,然后对user2进行身份验证,并且只能做user2可以做的事情。而这都是在同一个连接上完成的!而没有经过创建通道的开销,SSL握手等等......
那时候,驱动程序让我们拥有一个“空白”连接的连接池,我们可以根据当前执行线程的上下文随意地对其进行身份验证。
然后他们停用了这个功能能力,我想这是在Mongo 2.4版本,现在他们只支持在创建时进行身份验证的连接。我们向企业支持部门提出了问题,他们没有说为什么,但对我来说,看起来他们发现这种方式不安全,可能会泄漏“旧”的身份验证信息,并停留在那个“不是那么空白”的可重用连接上。
我们在多租户基础设施实现中做出了变化,从一个大的空白连接池到许多(小)已认证连接的池,每个租户一个池。这些按租户分配的池可以非常小,例如3或5个连接。这个解决方案很好地扩展到数百个租户,但为了满足成千上万的租户,我们必须进行各种优化,根据需要创建池,在空闲时间后关闭它们,对于非活动或休眠的租户进行惰性创建等等。这使我们能够进一步扩展...... 我们仍在寻找解决方案和优化方法。
您始终可以回到Mongo用户的全局池中,该用户具有访问多个数据库的权限。是的,您可以在同一接受身份验证的连接上切换数据库。但是您无法切换身份验证..
这是纯Mongo Java驱动程序的示例,我们使用Spring提供类似的功能:
MongoClient mongoClient = new MongoClient();
DB cust1db = mongoClient.getDB("cust1");
cust1db.get...
DB cust2db = mongoClient.getDB("cust2");
cust2db.get...
与此有关,我建议您查看MongoDB加密技术,这是一项企业级功能。它是根据不同的密钥来加密每个数据库(每个客户)的唯一方法。