mongodb用户身份验证问题

时间:2015-09-30 05:31:35

标签: mongodb grails

我正在尝试从SERVER-1连接到我的mongo服务器,该服务器在其他服务器SERVER-2中运行 所以我的grails应用程序在SERVER-1中运行。所以我给出了这样的外部配置。

grails {
    mongo {
        host = "<SERVER-2>-host"
        port = 27017
        username = "myapp"
        password = "myapp"
        databaseName = "myapp"
        options {
            autoConnectRetry = true
            connectTimeout = 3000
        }
    }
}

在SERVER-2中,我创建了myapp数据库并使用相同的用户和凭据

use myapp
db.createUser( { "user" : "myapp",
                 "pwd": "myapp",
                 "roles" : [] },
               { w: "majority" , wtimeout: 5000 } )

我能够看到如下的用户列表

> db.getUsers()
[
    {
        "_id" : "myapp.myapp",
        "user" : "myapp",
        "db" : "myapp",
        "roles" : [ ]
    }
]

Mongo配置包含“noauth = true”, 从SERVER-1,我可以使用以下命令连接到SERVER-2 mongo

mongo SERVER-2-HOST:27017/myapp  -u myapp -p myapp

但是当我尝试从SERVER-1 grails应用程序连接时,它给出了以下错误

| Error Error executing script LoadVars: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'mongoTransactionManager' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoTransactionManager': Cannot resolve reference to bean 'mongoDatastore' while setting bean property 'datastore'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoDatastore': FactoryBean threw exception on object creation; nested exception is org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [myapp], username = [myapp], password = [m***p]

我的mongod.conf文件

# mongod.conf

logpath=/var/log/mongodb/mongod.log

logappend=true

fork=true

#port=27017

dbpath=/var/lib/mongo

pidfilepath=/var/run/mongodb/mongod.pid

# Listen to local interface only. Comment out to listen on all interfaces.
#bind_ip=127.0.0.1

# nojournal=true

#cpu=true

#noauth=false
auth=true

我在这里遗漏了什么吗?

3 个答案:

答案 0 :(得分:2)

看起来您的MongoDB服务器正在运行并正常侦听但无法进行身份验证。

我看到的第一个问题是,你提到你的Grails应用程序在第一台服务器上运行,而你的MongoDB服务器在第二台,但host配置中的DataSource.groovy是配置为连接到第一个主机,而不是第二个主机。这只是在示例中,或者您的代码是否真的连接到第一台服务器(这是错误的)?请验证。

第二个问题可能是您将用户添加到数据库名称myapp的方式。请按照以下步骤操作,并在连接后重试:

1)登录第二台主机上的MongoDB实例:mongo
2)使用您的数据库use myapp
3)通过运行myapp确认您没有任何名为db.dropUser("myapp")的用户 4)现在添加用户:

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

现在连接您的Grails应用程序。

<强>更新

如果您使用的是MongoDB 3.x和Grails 2.5.x或2.4.x,那么这应该是您的身份验证失败的问题。我几乎忘了告诉你这个问题。

Grails以某种方式运送旧版本的Java驱动程序,即2.12.3并支持MongoDB 3,我们需要最少2.13.x的Java驱动程序。此外,3.0 Java驱动程序不是MongoDB 3.0的必需升级。 2.13.0版本是与MongoDB 3.0完全兼容所需的最低版本。

https://github.com/mongodb/mongo-java-driver/releases/tag/r3.0.0

因此,在BuildConfig.groovy中将其添加为dependency

dependencies {
    compile "org.mongodb:mongo-java-driver:2.13.1"
}

此外,如果您使用的是Grails mongeez插件,请从那里排除java驱动程序:

compile (":mongeez:0.2.3") {
    excludes("mongo-java-driver")
}

我将在Grails中为此创建一张票。希望这有帮助!

答案 1 :(得分:0)

创建特定于数据库的真实用户:
1.从cmd运行mongod 2.从cmd运行mongo 3.使用&#34; your_db_name&#34;
4.

db.createUser(
      {
        user: "anik",
        pwd: "password",
        roles: [ { role: "dbOwner", db: "your_db_name" } ]
      }
    ) 

记下数据库名称。插入urs。
5. mongo "your_db_name" -u anik -p password
6.切换到您的馆藏bson文件夹
7. mongorestore -d ss "abc.bson"

验证后,您可以使用项目属性文件中的用户名密码连接到数据库。

答案 2 :(得分:0)

我的设置问题。 其实我用的是grails mongo 3.0.0版 我安装了MongoDB 3.0.0。所以根据这个grails mongo documentation,grails mongo 3.0.0插件只支持MongoDB 2.6。但我使用的是3.0.0(升级版)。 检查一下。 https://github.com/grails/grails-data-mapping/issues/557 所以现在MongoDB 3.0不支持SCRAM-SHA-1 authSchema。因此,我们应该使用其他一些技术来验证我们的用户。