java 带密码连接mongodb

1、使用的是docker创建的mongodb

docker run --name mongodb0 -v /data/mongodb0:/data/db -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root --privileged=true -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo --auth

2、使用mongo-java-driver最新版驱动连接mongo库

<dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.11.0</version>
        </dependency>

3、因为设置了密码,通过直连会报错

new MongoClient("127.0.0.1");

报错信息如下 Authentication failed :

com.mongodb.MongoQueryException: Query failed with error code 13 and error message 'command find requires authentication' on server 127.0.0.1:27017
	at com.mongodb.operation.FindOperation$1.call(FindOperation.java:735)
	at com.mongodb.operation.FindOperation$1.call(FindOperation.java:725)
	at com.mongodb.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:463)
	at com.mongodb.operation.FindOperation.execute(FindOperation.java:725)
	at com.mongodb.operation.FindOperation.execute(FindOperation.java:89)
	at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:189)
	at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:143)
	at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92)
	at com.xiangyanshan.MongoDemo.main(MongoDemo.java:55)

 

4、通过密码连接

之前创建的时候,创建的是root:root账号密码,所以

List<ServerAddress> adds = new ArrayList<>();
//ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress("127.0.0.1", 27017);
adds.add(serverAddress);

List<MongoCredential> credentials = new ArrayList<>();
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential("root", "testdb", "root".toCharArray());
credentials.add(mongoCredential);

MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
        //build.
        //通过连接认证获取MongoDB连接

MongoClientOptions options = MongoClientOptions.builder()
                //设置连接超时时间为10s
                .connectTimeout(1000*10)
                //设置最长等待时间为10s
                .maxWaitTime(1000*10)
                .build();

MongoClient client = new MongoClient(adds, credentials,options);

看起来没毛病,但是,报错,提示,认证失败

Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server 127.0.0.1:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"}
	at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175)
	at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:303)
	at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:259)
	at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
	at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
	at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:130)
	at com.mongodb.internal.connection.SaslAuthenticator.access$100(SaslAuthenticator.java:40)
	at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:54)
	... 21 more

5、新增新用户用于java连接

网上度娘了一圈,发现要创建新用户,于是,dos下连接到mongo库

mongo 127.0.0.1/admin -uroot -proot

一波命令操作猛于虎,一看结果气的抖

use admin

db.auth("root","root")

db.dbs 查看数据库
testdb

use testdb 使用数据库

db.createUser(
    {
            user:"java",
            pwd:"123456",
            roles:[{role:"dbOwner",db:"testdb"}]
    }
)

提示 Use of SCRAM-SHA-256 requires undigested passwords:

[thread1] Error: couldn't add user: Use of SCRAM-SHA-256 requires undigested passwords :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1267:15

继续度娘,发现需要修改mechanisms加密方式,增加 mechanisms : ["SCRAM-SHA-1"],执行成功

db.createUser(
    {
            user:"java",
            pwd:"123456",
            roles:[{role:"dbOwner",db:"testdb"}],
            mechanisms : ["SCRAM-SHA-1"]
    }
)

再修改用户名密码,连上

MongoCredential.createScramSha1Credential("java", "testdb", "123456".toCharArray());

总结:

这个连接从创建容器到java连接,尝试了很多次,作为一个程序员,一定要有耐心。慢慢研究下去终会成功。

上一篇:Object.freeze


下一篇:Android:无法使用DownloadManager将数据从服务器下载到内部存储器