2015-02-05 150 views
1

我正試圖從openshift中的java應用程序連接到mongodb數據庫,並且在允許的角色和操作方面遇到了一些麻煩。如何在mongodb中爲用戶提供診斷操作listDatabases?

我運行RCH端口轉發命令,像這樣:

rhc port-forward -a test 

這一切都很大,我能夠使用連接到數據庫:

mongo admin -u admin -p '*******' --host 127.0.0.1 --port 44506 

,我可以執行命令像:

> use test 
> show databases 

但是,如果我直接連接到我的數據庫使用:

mongo test -u admin -p '*******' --host 127.0.0.1 --port 44506 

我無法運行show命令數據庫

listDatabases failed:{ "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/mongo.js:47 

我怎能捨棄動作listDatabases這個用戶在這個數據庫?

我MongoDB的文檔http://docs.mongodb.org/manual/reference/privilege-actions/#security-user-actions 其中約診斷操作會談,但沒有提到如何給這樣的行動給用戶找到了這個網頁。

感謝您的幫助。

+0

如果您以應用程序身份運行mongodb shell並以該用戶身份運行mongodb shell,是否可以執行該命令? – 2015-02-05 17:36:01

+0

編號相同的行爲。 – JGS 2015-02-05 18:14:56

回答

3

您以兩個不同的用戶身份登錄。用戶的範圍是命名空間,因此,住在test中的用戶John與住在admin中的用戶John不同,儘管兩個Johns在test數據庫中都有權限。我想你可能已經理解了這一點,但我想澄清一下,以防萬一。

我不相信你可以給一個用戶範圍限定於非admin數據庫的特權listDatabases操作,因爲listDatabases行動必須符合cluster資源去(listDatabases是操作的羣集範圍排序),以及具有cluster資源的特權只能作用於admin數據庫上的角色。刪除MongoDB授權模型的行話,非admin數據庫用戶不能使用listDatabases,因爲它是一個集羣範圍內的操作,並且只有admin數據庫用戶應該能夠執行羣集範圍的事情。

+0

這會產生問題。因爲我正在使用Java驅動程序進行連接,並且需要在某個時刻執行{listDatabases:1}命令。顯而易見,我並沒有將管理員權限授予完整數據庫。 http://grepcode.com/file/repo1.maven.org/maven2/org.mongodb/mongo-java-driver/2.12.4/com/mongodb/Mongo.java#389 – JGS 2015-02-05 19:12:14

+0

您不需要給予用戶管理權限。您只需要在'admin'數據庫上創建用戶,以便他可以接收特殊的多數據庫特權,如'listDatabases'特權。您可以讓用戶列出所有數據庫,但只能插入,更新或查找一個數據庫。 – wdberkeley 2015-02-05 19:19:43

+0

你可以給我一個如何做的例子,或者指導我到一個地方解釋如何做到這一點? 我是所有的mongodb世界的新手。 – JGS 2015-02-05 19:27:55

2

正如wdberkeley所述,您必須在admin數據庫中擁有能夠列出數據庫的用戶。

要做到這一點,首先必須爲該用戶創建讓他們列出數據庫的一個很小的「角色」,然後創建一個用戶既這個角色和閱讀中的作用,寫你的其他數據庫:

use admin 

db.runCommand({ createRole: "listDatabases", 
    privileges: [ 
     { resource: { cluster : true }, actions: ["listDatabases"]} 
    ], 
    roles: [] 
}) 

db.createUser({ 
    user: "<userName>", 
    pwd: "<passwd>", 
    roles: [ 
     { role: "readWrite", db: "test" }, 
     { role: "listDatabases", db: "admin" } 
    ] 
}) 

如果您想了解有關這些命令的更多信息,MongoDB文檔對createRolecreateUser都有引用。

+0

我無法運行createRole命令,我懷疑它與mongodb版本有關,openshift當前是2.4.9 ...並且這是2.6.x ...我得到了「沒有這樣的cmd: CREATEROLE」。 – JGS 2015-02-10 15:02:35

0

只是想添加i80提到的方法,並在MongoDB 3.2上工作。3

  1. 創建包含listDatabase來,並指定集羣定製角色:真的,我做到了,當指定資源作爲分貝,這是行不通的
  2. 授予這個角色給用戶 注:請確保您連接到執行安全任務時的正確數據庫,因爲您需要在創建用戶時使用此特定數據庫進行身份驗證