【问题标题】:Java MongoDB Exception: can't authenticate twice on the same databaseJava MongoDB 异常:不能在同一个数据库上进行两次身份验证
【发布时间】: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


【解决方案1】:

我认为限制是设计使然。也许 mongodb 身份验证更适合应用程序 数据库的上下文,而不是用户 应用程序。如果您需要验证用户对应用程序的访问权限,最好自己实现(例如:使用 Java EE / Spring Security)

【讨论】:

  • 是的,这可能是设计限制。我已经在我的 RMI 项目中实现了一种使用 JAAS 的身份验证方法。但我想对存储在 MongoDB 实例中的文档进行访问控制。这样一些“标准”用户只能阅读文档,而一些管理员可以插入新文档、更新文档等。为此,我必须创建用户并使用这些凭据进行身份验证。只能为每个用户创建一个 MongoClient 实例,或者您还有其他建议吗?谢谢。
  • 在这种情况下,您需要在应用程序中同时实现身份验证和授权——而不是依赖 MongoDB 来完成。我知道这与 Oracle 等典型 RDBMS 的概念不同。这是因为 - 正如您所提到的 - 如果您在每个用户会话中使用一个 MongoClient 实例,您的应用程序可能会失去效率
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2019-03-21
  • 2016-10-30
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多