我正在尝试从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
我在这里遗漏了什么吗?
答案 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。因此,我们应该使用其他一些技术来验证我们的用户。