boa noite a todos,
antes de tudo agradeço qualquer ajuda que eu tiver.
meu problema é o seguinte, comecei a usar o mongoDB recentemente, estava trabalhando com ele sem autenticação, mas agora preciso autenticar nele via java, e não está funcionando.
O mongo está em uma VM, eu tinha instalado ele, mas quando tento inicia-lo, estando no windows 7, pede uma DLL que tem no service pack 1 do windows 7, achei melhor montar uma VM com windows 10 , instalar o mongo na vm, configurar a rede entre maquinas física e virtual, e sem autenticação isso está funcionando normalmente.
estou pedindo a autenticação na linha de comando, que está da seguinte forma:
mongod --port 27017 --dbpath C:\DSV\mongoDB\teste\data\ --logpath C:\DSV\mongoDB\teste\log\teste.log --auth
abaixo a dependência no maven:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.1</version>
</dependency>
Abaixo meu código java
package nome.pacote.empresa.teste.cargabase.dao;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.porto.security.cryptography.CryptographyException;
public class MainUtilitarioMongoLocal3 {
public static void main(String[] args) throws CryptographyException, UnknownHostException {
String nomeBanco = "admin";
String nomeCollection = "CPF";
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(
MongoCredential.createMongoCRCredential(
"flavio", nomeBanco, "flavio".toCharArray())
);
List<ServerAddress> seeds = new ArrayList<ServerAddress>();
seeds.add(new ServerAddress("192.168.56.103", 27017));
// MongoClient mongo = new MongoClient (seeds);
MongoClient mongo = new MongoClient (seeds, credentials);
DB db = mongo.getDB(nomeBanco);
DBCollection colecao = db.getCollection(nomeCollection);
BasicDBObject query = new BasicDBObject();
query.put("cpf", "12345678901");
try {
BasicDBObject testeUpdate = new BasicDBObject();
testeUpdate.put("cpf", "12345678901");
boolean upsert = true;
boolean multi = false;
// colecao.update(testeUpdate, testeUpdate, upsert, multi);
colecao.insert(testeUpdate);
System.out.println("update ok");
} catch (Exception e) {
e.printStackTrace();
}
mongo.close();
}
}
exceção que ta ocorrendo:
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.56.103:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'auth failed' on server 192.168.56.103:27017. The full response is { "ok" : 0.0, "errmsg" : "auth failed", "code" : 18, "codeName" : "AuthenticationFailed" }}}]
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369)
at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:71)
at com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:219)
at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:133)
at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:60)
at com.mongodb.Mongo.execute(Mongo.java:781)
at com.mongodb.Mongo$2.execute(Mongo.java:764)
at com.mongodb.DBCollection.executeWriteOperation(DBCollection.java:333)
at com.mongodb.DBCollection.insert(DBCollection.java:328)
at com.mongodb.DBCollection.insert(DBCollection.java:319)
at com.mongodb.DBCollection.insert(DBCollection.java:289)
at com.mongodb.DBCollection.insert(DBCollection.java:255)
at com.mongodb.DBCollection.insert(DBCollection.java:192)
at com.porto.portoseg.powercurve.cargabase.dao.MainUtilitarioMongoLocal3.main(MainUtilitarioMongoLocal3.java:51)
O estranho, é que teoricamente, essa exceção poderia ser problema de rede, mas se eu deixo de passar a variável credentials no construtor do objeto mongo, ai conectaria, mas daria erro de permissão, quando não requer autenticação do lado servidor, também funciona, mas apenas se você tirar a autenticação do código também, removendo.
Estando na VM, autenticando esses mesmos usuário e senha ( mongo --port 27017 -u “flavio” -p “flavio” --authenticationDatabase “admin” ), eu entro na mesma database e chamo a inclusão e funciona sem problemas.
alguma dica para fazer funcionar a partir de código java???