2016-09-17 131 views
0

嗨,我正在做一些關於java和mongoDB的實驗。我已經成功安裝了mongoDB並能夠通過命令行進行連接。但是,當我嘗試通過java連接,然後它給我錯誤的身份驗證。我試着在下列方式:Java mongo db身份驗證失敗

[email protected]:~$ mongo -u admin -p admin123 --authenticationDatabase admin 
MongoDB shell version: 3.2.9 
connecting to: test 
Server has startup warnings: 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] **  We suggest setting it to 'never' 
2016-09-17T16:29:31.090+0530 I CONTROL [initandlisten] 
> 

,並通過java代碼:

package mongo; 

import java.net.UnknownHostException; 
import java.util.Date; 
import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.DBCursor; 
import com.mongodb.Mongo; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoException; 

/** 
* Java + MongoDB Hello world Example 
* 
*/ 
public class App { 
    public static void main(String[] args) { 

    try { 

     Mongo mongo = new Mongo("localhost", 27017); 
     DB db = mongo.getDB("testdb"); 

     boolean auth = db.authenticate("admin", "admin123".toCharArray()); 

    if (auth) { 

     System.out.println("Login is successful!"); 
    } else { 
     System.out.println("Login is failed!"); 
    } 
    System.out.println("Done"); 


    } catch (UnknownHostException e) { 
    e.printStackTrace(); 
    } catch (MongoException e) { 
    e.printStackTrace(); 
    } 

    } 
} 

,並得到了它的結果:

Login is failed! 
Done 

這有什麼錯?需要一些幫助。謝謝。

+0

ÿ您正在使用Mongo Java驅動程序v2的語法。更好地切換到Mongo3語法(MongoClient和MongoCredentials):http://mongodb.github.io/mongo-java-driver/3.0/driver/reference/connecting/authenticating/ http://www.programcreek.com/java-api -examples/index.php?api = com.mongodb.MongoCredential – Robert

+0

testdb是錯誤的,應該測試。嘗試並讓我知道這是否有幫助 – harshavmb

回答

0
mongo -u admin -p admin123 --authenticationDatabase admin 

當您嘗試使用mongo shell登錄時,您正在向db admin進行身份驗證。但是,在代碼中它看起來像你試圖用分貝TESTDB

DB db = mongo.getDB("testdb"); 

評估您的登錄憑據它應該是在兩地相同的。

+0

嗨天文我沒有得到你。你能解釋一下嗎? – nilkash

+0

對於哪個數據庫用戶admin被創建? – Astro

1

在最新版本的MongoDB 3.2中,默認的認證機制是「SCRAM-SHA-1」。有一個單獨的類可用於此身份驗證。我會建議使用這種最新的方法。

欲瞭解更多信息,請參閱此link。下面

例子: -

只是數據庫名稱,用戶名,密碼,因此在下面的代碼。它應該適合你。

public static void main(String[] args) { 

MongoClient mongoClient = null; 
     MongoCredential mongoCredential = MongoCredential.createScramSha1Credential("admin", "admin", 
       "admin123".toCharArray()); 

     mongoClient = new MongoClient(new ServerAddress("localhost", 27017), Arrays.asList(mongoCredential)); 

     DB db = mongoClient.getDB("testdb"); 

     System.out.println(db.getStats()); 
     System.out.println(db.getCollectionNames()); 

     mongoClient.close(); 
    } 

相關性: -

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

用戶創建: -

use admin; 

db.createUser({ user : "admin", pwd : "admin123", roles : ["dbAdmin"]}); 

要檢查用戶的詳細信息: -

use admin; 

db.getUsers(); 
+0

嗨,我試過你的解決方案。但它給了我'認證失敗'。在服務器localhost:27017'上輸入我的用戶名和密碼。如果嘗試使用命令行'mongo -u admin -p admin123 --authenticationDatabase admin',它可以正常工作。 – nilkash

+0

@nilkash如果你可以使用[Robomongo](https://robomongo.org/)工具 – Robert

+0

通過TCP向Mongo成功驗證,請嘗試更新一些命令。請檢查您是否創建了這樣的用戶。另外,請執行getUser並讓我們知道輸出。我更新了Java代碼,以準確反映您的用戶和密碼的詳細信息。請嘗試。我使用createUser命令創建了用戶並執行了代碼。它工作正常。 – notionquest