4

我有一个 Jhipster Spring Boot 项目。最近我从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 层上存在此问题。

Mongo DB 版本:3.4

罐子和它的版本名称:'mongobee',版本:'0.10' 名称:'mongo-java-driver',版本:'3.4.2'

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

4

4 回答 4

9

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

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

或者,对于 read 和 readWrite 角色,您还可以指定一个集合。如果不指定 read 和 readWrite 的集合,则该角色适用于数据库中的所有集合(不包括某些 system.collection)。

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

更新:为了在MongoBee发布新版本之前解决问题:

  1. 获取MongoBee git 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 jarmvn clean install
  5. /target从文件夹或本地获取已编译的 jar/.m2
  6. 将 jar 用作项目的依赖项
于 2018-04-23T09:04:13.480 回答
2

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

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());
    }

}
于 2018-04-24T04:08:52.697 回答
0
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 必须使用不同的版本,因为我在实现上述代码时得到了这一点。看起来它期待一个不同的版本。

于 2018-05-03T23:14:54.880 回答
0

这种访问是mongobeesystem.indexes中的一个开放问题。该问题已在项目中修复,但在发布修复程序之前该项目已被放弃。

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

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

总结这些库:

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