2015-02-05 149 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. 授予这个角色给用户 注:请确保您连接到执行安全任务时的正确数据库,因为您需要在创建用户时使用此特定数据库进行身份验证