连接后,mongobee 在 Atlas 集群上读取 DBname.system.indexes 失败



我有一个Jhipster Spring启动项目。最近,我从mlabs独立沙箱转移到 Atlas 集群沙箱 M0 免费层副本集。它甚至有效,我已经对它进行了一些数据库操作。但是现在由于某种原因,出现了读取权限错误

Error creating bean with name 'mongobee' defined in class path resource [DatabaseConfiguration.class]: Invocation of init method failed; nested exception is com.mongodb.MongoQueryException: Query failed with error code 8000 and error message 'user is not allowed to do action [find] on [test.system.indexes]' on server ********-shard-00-01-mfwhq.mongodb.net:27017

您可以在此处查看完整堆栈 https://pastebin.com/kaxcr7VS

我已经搜索了高低,我能找到的只是 M0 层用户无权覆盖我没有做的管理数据库。

即使是现在,与Mlabs DB的连接也可以正常工作,但在Atlas DB M0层上存在此问题。

蒙戈数据库版本 : 3.4

罐子和它的版本 名称:"蒙戈比",版本:"0.10" 名称:"mongo-java-driver",版本:"3.4.2">

@Neil伦 我用来连接的用户ID是管理员的用户ID,连接读写通过shell或Robo3T(mongo客户端)工作

在与MongoDB支持团队讨论后,MongoDB 3.0不推荐直接访问system.indexes集合,该集合以前用于列出数据库中的所有索引。应用程序应改用db.<COLLECTION>.getIndexes()

从MongoDB Atlas文档中可以看出,他们可能会禁止调用system.集合:

(可选)对于读取和读写角色,还可以指定集合。如果未指定用于读取和读写的集合,则该角色将应用于数据库中的所有集合(某些系统集合除外)。

从堆栈跟踪中可以看出,MongoBee正在尝试进行此调用,因此现在是库问题,应该进行更新。

更新:为了在MongoBee发布新版本之前修复问题:

  1. 获取MongoBeegit clone git@github.com:mongobee/mongobee.git的最新来源,cd mongobee
  2. 提取拉取请求git fetch origin pull/87/head:mongobee-atlas
  3. 结帐git checkout mongobee-atlas
  4. 安装MongoBee罐mvn clean install
  5. /target文件夹或本地/.m2获取编译的 jar
  6. 将 jar 用作项目的依赖项

今天早上遇到了这个问题。这是一个快速而肮脏的猴子补丁:

package com.github.mongobee.dao;
import com.github.mongobee.changeset.ChangeEntry;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import java.util.List;
import static com.github.mongobee.changeset.ChangeEntry.CHANGELOG_COLLECTION;
public class ChangeEntryIndexDao {
public void createRequiredUniqueIndex(DBCollection collection) {
collection.createIndex(new BasicDBObject()
.append(ChangeEntry.KEY_CHANGEID, 1)
.append(ChangeEntry.KEY_AUTHOR, 1),
new BasicDBObject().append("unique", true));
}
public DBObject findRequiredChangeAndAuthorIndex(DB db) {
DBCollection changelogCollection = db.getCollection(CHANGELOG_COLLECTION);
List<DBObject> indexes = changelogCollection.getIndexInfo();
if (indexes == null) return null;
for (DBObject index : indexes) {
BasicDBObject indexKeys = ((BasicDBObject) index.get("key"));
if (indexKeys != null && (indexKeys.get(ChangeEntry.KEY_CHANGEID) != null && indexKeys.get(ChangeEntry.KEY_AUTHOR) != null)) {
return index;
}
}
return null;
}
public boolean isUnique(DBObject index) {
Object unique = index.get("unique");
if (unique != null && unique instanceof Boolean) {
return (Boolean) unique;
} else {
return false;
}
}
public void dropIndex(DBCollection collection, DBObject index) {
collection.dropIndex(index.get("name").toString());
}
}
Caused by: java.lang.NoSuchMethodError: com.github.mongobee.dao.ChangeEntryIndexDao.<init>(Ljava/lang/String;)V
at com.github.mongobee.dao.ChangeEntryDao.<init>(ChangeEntryDao.java:34)
at com.github.mongobee.Mongobee.<init>(Mongobee.java:87)
at com.xxx.proj.config.DatabaseConfiguration.mongobee(DatabaseConfiguration.java:62)
at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5.CGLIB$mongobee$1(<generated>)
at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5$$FastClassBySpringCGLIB$$f202afb.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)
at com.xxx.proj.config.DatabaseConfiguration$$EnhancerBySpringCGLIB$$4ae465a5.mongobee(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
... 22 common frames omitted

Jhipster 5 必须使用不同的版本,因为我在实现上述代码时得到了它。 看起来它期待不同的版本。

这种对system.indexes的访问在 mongobee 中是一个悬而未决的问题。 该问题已在项目中修复,但在修复程序发布之前该项目已被放弃。

由于这个项目的放弃,从mongobee分叉了两个后继库,它们已经解决了这个问题:Mongock和mongobeeJ。

将应用程序的依赖项从 mongobee 库切换到这些后续库之一将允许您在 Atlas 上运行 mongobee 数据库迁移。

要总结这些库,请执行以下操作:

  • Mongock - 2018年从mongobee分叉而来。 积极维护。 与原始版本相比有了显着的发展,包括对Spring,Spring Boot以及Mongo Java驱动程序的版本3和4的内置支持。
  • mongobeeJ - 2018年从mongobee分叉而来。 已发布五个更新版本。 从原始蒙戈比进化而来的最小。 Mongo Java 驱动程序 4 支持于 2020 年 8 月实施。 该项目于 2020 年 8 月弃用,其创建者建议改用 Mongock 等库。

最新更新