2016-09-17 132 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