【发布时间】:2013-05-28 22:17:16
【问题描述】:
我在使用 Java 驱动程序 2.11.1 进行 MongoDB 用户身份验证时遇到问题。我在 admin 数据库中添加了一些管理员用户(dbAdmins、userAdmins 等)。
按照 MongoDB 教程的建议,我只使用 MongoClient 对象的一个实例:它被实现为单例,因为 MongoClient 对象就像一个连接池。
如果管理员想要访问数据库,他将与全局 MongoClient 实例建立一个与数据库的新连接(从池中获取一个连接)并调用驱动程序的身份验证方法:示例:
MongoClient mongoClient = new MongoClient("ip", "port");
DB adminDB = mongoClient.getDB("admin");
boolean isAuth = adminDB.authenticate("Admin", "Admin1234".toCharArray());
DB anotherAdminDB = mongoClient.getDB("admin");
boolean isAuth2 = anotherAdminDB.authenticate("UserAdmin", "UserAdmin1234".toCharArray());
如果我这样做,我会得到异常:
java.lang.IllegalStateException: 不能在同一个上进行两次身份验证 数据库
但每个管理员用户都必须使用自己的凭据进行身份验证。有人有这个问题吗?你怎么能解决这个问题?
如果我为每个管理员创建一个新的 MongoClient,那么不会抛出异常并且一切都是正确的。但是后来我就不能使用Mongo的连接池了。
谢谢你和最好的问候。
【问题讨论】:
-
你可以创建2个MongoClient,这将工作,并且会有两个连接池。有什么害处?
-
是的,但正如我提到的(向下一条评论),它是一个有许多用户的分布式 RMI 应用程序。如果我为每个用户会话创建一个 MongoClient,那么我必须处理所有连接问题,例如关闭等。连接池将为我做什么。另一点是性能损失的可能性。但那时我真的不明白为什么 MongoDB 允许创建不同的用户,因为每个数据库只能同时进行一次身份验证。
标签: java mongodb authentication