Mik*_* B. 6 java authentication mongodb
我在我的应用程序中使用MongoDB 3.2.下面的代码演示了数据库初始化逻辑
private void dbInit(String dbName) {
String mongoClientURI = "mongodb://" + DB_URL + ":" + DB_PORT;
MongoClientURI connectionString = new MongoClientURI(mongoClientURI);
// enable SSL connection
MongoClientOptions.builder().sslEnabled(true).build();
if (this.mongoClient == null) {
this.mongoClient = new MongoClient(connectionString);
}
// create database if doesn't exist
this.mongoClient.getDatabase(dbName);
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,现在我想引入访问级别分离到数据库.
这样做的步骤:
定义用户:
use myAppDB
db.createUser(
{
"user": "myAdmin",
"pwd": "123090d1487dd4ab7",
roles: [ "readWrite", "dbAdmin" ]
}
)
use myAppDB
db.createUser(
{
"user": "guest",
"pwd": "guest",
roles: [ "read" ]
}
)
Run Code Online (Sandbox Code Playgroud)在身份验证模式下重新创建MongoDB 3.2服务:
"C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe" --install --dbpath=C:\data\db --logpath=C:\data\log\log.txt --auth --service.并运行它.
将mongoClientURI连接字符串更改为
String mongoClientURI = "mongodb://" + DB_SRV_USR + ":" + DB_SRV_PWD + "@" + DB_URL + ":" + DB_PORT;
Run Code Online (Sandbox Code Playgroud)
其中DB_SRV_USR= myAdmin和DB_SRV_PWD= 123090d1487dd4ab7.
Mongo Explorer使用相同的凭据检查IDEA中经过身份验证的连接,一切正常.
执行我的应用程序并获得异常Authentication failed.
我的问题:
myAppDB到admin表还是表?在一些教程中,我看到用户是在admin表中创建的,这是一个好主意还是值得在他们将要使用的数据库中创建用户?使用mongodb-3.4.2和mongo-java-driver-3.4.2.jar进行测试
(1)使用MongoCredential
MongoCredential credential = MongoCredential.createCredential("user", "database", "passwd".toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress("localhost", 27017), Arrays.asList(credential));
MongoDatabase db = mongoClient.getDatabase( "test" );
MongoCollection collection = db.getCollection("mycol");
FindIterable fi = collection.find();
MongoCursor cursor = fi.iterator();
Run Code Online (Sandbox Code Playgroud)
(2)使用MongoClientURI
MongoClientURI uri = new MongoClientURI("mongodb://user:passwd@localhost:27017/?authSource=test");
MongoClient mongoClient = new MongoClient(uri);
Run Code Online (Sandbox Code Playgroud)
有一些变体形式可以将MongoCredential和MongoClientURI用于不同的身份验证机制,请在此处查看详细信息
正如MarkusWMahlberg正确指出的那样,有必要在连接字符串中记下数据库名称。
例如:
String mongoClientURI = "mongodb://" + DB_SRV_USR + ":" + DB_SRV_PWD + "@" + DB_URL + ":" + DB_PORT + "/" + dbName;
Run Code Online (Sandbox Code Playgroud)