2015-09-30 87 views
1

我想從SERVER-1連接到我在其他服務器上運行的mongo服務器SERVER-2 所以我的grails應用程序在SERVER-1中運行。所以我給了這樣的外部配置。MongoDB用戶認證問題

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

以及服務器-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

你在使用MongoDB 3和Grails 2.4.x或2.5.x嗎? –

+0

如果是,請參閱我的更新答案。這一定是你的問題。 –

回答

0

創建數據庫特定的可信用戶:從CMD
從CMD 2.運行蒙戈
3.使用 「your_db_name」
4.

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

注意到了
1.運行的mongod數據庫名稱。插入urs。
5. mongo "your_db_name" -u anik -p password
6.切換到您的收藏夾BSON

身份驗證後,你可以連接從項目屬性使用用戶名的密碼文件爲DB。

+0

Hi @Istiak Morsalin,謝謝你的回覆。根據你的評論,我只錯過了「dbOwner」的角色。所以我也給了它。所以現在我仍然無法從grails應用程序連接。 在我的mongodb配置文件中,我已經註釋掉「bind_ip」配置來啓用所有端口。這是造成這個問題嗎? –

+0

您必須通過運行mongo 199.21.114.XX來指定IP(199.21.114.XX)。 否則,如果您希望它也在本地主機上偵聽,則應該刪除配置文件中的bind_ip設置。 更新檢查您的防火牆配置。由於您要連接到外部IP,因此可以將其配置爲阻止,即使是從本地框中。 –

2

看起來您的MongoDB服務器正在運行並正常監聽,但無法進行身份驗證。

我看到的第一個問題是,你提到你的Grails應用程序的第一個服務器上運行,而你的MongoDB服務器是二號,但在你的DataSource.groovy配置host配置連接到主機1,不第二。這只是在例子中,或者你的代碼真的連接到第一臺服務器(這是錯誤的)?請驗證它。

第二個問題可能與您將用戶添加到數據庫名稱myapp的方式有關。請按照下列步驟操作和連接後再試一次:

1)登錄到MongoDB實例2號主機上:mongo
2)使用數據庫use myapp
3)確認你不沒有任何用戶通過運行名爲myappdb.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,我們需要Java驅動程序的最低2.13.x。此外,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中爲此創建一張票。希望這可以幫助!

+0

是的Shashank,謝謝你的回覆。 URL指向SERVER-2本身(這是我的輸入錯誤) 然後我放棄了舊用戶,並使用上述命令創建了新用戶。 我可以從SERVER-1命令行連接到SERVER-2,使用下面的命令 mongo SERVER-2-HOST:27017/myapp -u myapp -p myapp 但是仍然無法連接到SERVER- 2從SERVER-1的Grails應用程序 –

+0

能否請您粘貼'mongod.conf'(可能在'/ etc/mongod.conf')如果舒適 –

+0

我增加了配置文件請 –

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。所以我們應該使用其他一些技術來驗證我們的用戶。