2015-05-14 9 views
5

1 - Utworzono użytkownika w Mongo shellNie można uwierzytelnić użytkownika w MongoDB 3.0.2 przy użyciu połączenia java

> use admin 
switched to db admin 
> db.createUser({ user:"tiger", pwd:"secret", roles: [ { role:"readWrite", db:"zoo" } ] }) 
Successfully added user: { 
    "user" : "tiger", 
    "roles" : [ 
     { 
      "role" : "readWrite", 
      "db" : "zoo" 
     } 
    ] 
} 

2 - Połączenie z bazą danych z Java

List<ServerAddress> seeds = new ArrayList<ServerAddress>(); 
seeds.add(new ServerAddress("remoteserver")); 
List<MongoCredential> credentials = new ArrayList<MongoCredential>(); 
credentials.add(
    MongoCredential.createMongoCRCredential(
     "tiger", 
     "admin", 
     "secret".toCharArray() 
    ) 
); 
MongoClient mongoClient = new MongoClient(seeds); //, credentials); 
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, "zoo"); 

3 - Wstaw wiersz

mongoTemplate.insert(animal, "animal"); 

4 - Pobierz ten błąd (ten kod działa, gdy nie używam uwierzytelniania)

2015-05-13 23:11:36.166 ERROR 67846 --- [nio-8443-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.UncategorizedMongoDbException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18}; nested exception is com.mongodb.CommandFailureException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18}] with root cause 

com.mongodb.CommandFailureException: { "serverUsed" : "remoteserver:27017" , "ok" : 0.0 , "errmsg" : "auth failed" , "code" : 18} 
    at com.mongodb.CommandResult.getException(CommandResult.java:76) 
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:131) 
    at com.mongodb.DBPort$NativeAuthenticator.authenticate(DBPort.java:652) 
    at com.mongodb.DBPort.authenticate(DBPort.java:364) 
    at com.mongodb.DBPort.checkAuth(DBPort.java:375) 
    at com.mongodb.DBTCPConnector.doOperation(DBTCPConnector.java:206) 
    at com.mongodb.DBCollectionImpl.writeWithCommandProtocol(DBCollectionImpl.java:424) 
    at com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:389) 
    at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:188) 
    at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:167) 
    at com.mongodb.DBCollection.insert(DBCollection.java:93) 
    at com.mongodb.DBCollection.insert(DBCollection.java:78) 
    at com.mongodb.DBCollection.insert(DBCollection.java:120) 
    at org.springframework.data.mongodb.core.MongoTemplate$8.doInCollection(MongoTemplate.java:904) 
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:410) 
    at org.springframework.data.mongodb.core.MongoTemplate.insertDBObject(MongoTemplate.java:899) 
    at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:721) 
    at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:676) 

Odpowiedz

15

Trochę kopanie i stwierdziliśmy, że Mongo 3 nie lubi challenge-response i woli 'MongoCredential.createScramSha1Credential'

List<ServerAddress> seeds = new ArrayList<ServerAddress>(); 
seeds.add(new ServerAddress("remoteServer")); 
List<MongoCredential> credentials = new ArrayList<MongoCredential>(); 
credentials.add(
    MongoCredential.createScramSha1Credential(
     "username", 
     "adminDatabase", 
     "password".toCharArray() 
    ) 
); 
MongoClient mongoClient = new MongoClient(seeds, credentials); 
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, "applicationDatabase"); 
mongoTemplate = new MongoTemplate(mongoDbFactory); 
+1

Proszę odnieść się do tego łącza, aby uzyskać więcej szczegółowych informacji o błędach uwierzytelniania w Mongo 3.0 z powodu zmiany mechanizmu uwierzytelniania - http://www.claudiokuenzler.com/blog/553/authentication-mongodb-3.x-failed-with- mechanizm-mongodb-C# .VkCO-64rLGI – IsAs

+0

Przejście na MongoCredential.createCredential zadziałało dla mnie. – cnmuc

0

Podczas korzystania z zależnością maven z artefactId „wiosna-boot -starter-data-mongodb "MongoCredential.createScramSha1Credential nie był dostępny.

Więc tutaj jest to, co musiałem zrobić:

a) załączyć zależność maven do MongoDB w pom.xml:

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

B) przy użyciu roztworu z user4898172 (MongoCredential .createScramSha1Credential)

public Mongo mongo() throws Exception { 
    List<MongoCredential> credentials = new ArrayList<>(); 
    credentials.add(MongoCredential.createScramSha1Credential(username, database, password.toCharArray())); 

    return new MongoClient(new ServerAddress(host, port), credentials); 
} 

te dwie zmiany pomógł mi rozwiązać th e exeption:

com.mongodb.CommandFailureException: { "serverUsed": "SerwerZdalny: 27017", "OK": 0.0, "Komunikat o błędzie": "nie udało auth", "kod" : 18}

(używam MongoDB wersję serwera: 3.4.0)

mongodb github site to również dobre odniesienie do szczegółów implementacyjnych.

Powiązane problemy