如何在mongodb中为用户提供诊断操作listDatabases?

时间:2015-02-05 15:47:51

标签: mongodb authentication openshift

我尝试在openshift中从java应用程序连接到mongodb数据库,并且我在允许角色和操作方面遇到了一些麻烦。

我像这样运行rch port-forward命令:

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 databases命令

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

如何在此数据库中向此用户提供操作列表数据库?

我在mongodb文档http://docs.mongodb.org/manual/reference/privilege-actions/#security-user-actions中找到了这个页面 其中讨论了诊断操作,但未提及如何向用户提供此类操作。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您以两个不同的用户身份登录。用户的命名空间由命名空间限定,因此居住在test的用户John与居住在admin的用户John不同,尽管Johns可能拥有test数据库中的权限。我想你可能已经理解了这一点,但我想澄清一下以防万一。

我不相信您可以将用户限定为非admin数据库中的listDatabases操作权限,因为listDatabases操作必须与{cluster操作一起使用1}} resource(listDatabases是一种群集范围的操作),具有cluster资源的权限只能作用于admin数据库上的角色。删除MongoDB授权模型的术语,非admin数据库用户无法使用listDatabases,因为它是群集范围内的操作且仅{{1}数据库用户应该能够进行群集范围的事情。

答案 1 :(得分:4)

正如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的参考。

答案 2 :(得分:0)

只想添加i80提到的方法并在MongoDB 3.2.3上运行

  1. 创建包含listDatabase的自定义角色并指定cluster:true,我在将资源指定为db时执行了此操作,但它不起作用
  2. 将此角色授予用户 注意:确保在执行安全任务时连接到正确的数据库,因为您需要使用创建用户的特定数据库进行身份验证