我有以下代码可保存到本地运行的mongo实例:
MongoCredential credential = MongoCredential.createCredential("myuser", "mydatabase", "mypassword".toCharArray());
MongoClient mongo = MongoClients.create(MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new
ServerAddress("localhost", 27017))))
.credential(credential)
.build());
MongoDatabase database = mongo.getDatabase("mydatabase");
MongoCollection<Document> collection = database.getCollection("mycollection");
collection.insertOne(document);
我已经在mongo.exe shell中使用db.createUser()命令为上面代码中使用的usernmae /密码创建了一个用户,这些与我在安装mongodb时提供的凭据相同。
db.createUser(
{ user: "myuser",
pwd: "mypassword",
roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})
但是代码失败并显示:
Exception in thread "main" com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='myuser', source='mydatabase', password=<hidden>, mechanismProperties={}}
我在这里想念什么?
答案 0 :(得分:1)
在哪里(即您在哪个数据库中创建用户)?通常,用户是在数据库admin
中创建的。连接到MongoDB时,应始终指定身份验证数据库和您要使用的数据库。
默认值有点令人困惑,请参阅下表以获得概述:
+---------------------------------------------------------------------------------------------+
|Connection string | Authentication DB | Current DB |
+---------------------------------------------------------------------------------------------+
|mongo -u <...> -p <...> --authenticationDatabase admin myDB | admin | myDB |
|mongo -u <...> -p <...> myDB | myDB | myDB |
|mongo -u <...> -p <...> --authenticationDatabase admin | admin | test |
|mongo -u <...> -p <...> | admin | test |
+---------------------------------------------------------------------------------------------+
如果您想使用URI格式的Connection字符串,它将与以下内容相对应:
mongodb://<username>:<password>@hostname/myDB?authSource=admin
mongodb://<username>:<password>@hostname/myDB
mongodb://<username>:<password>@hostname?authSource=admin
mongodb://<username>:<password>@hostname
我猜您是在admin
数据库中创建用户的,但是由于您在连接时未指定authenticationDatabase,因此Mongo默认将其设置为mydatabase
,因为用户不存在于数据库{{1 }}。