我尝试在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中找到了这个页面 其中讨论了诊断操作,但未提及如何向用户提供此类操作。
感谢您的帮助。
答案 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文档包含createRole
和createUser
的参考。
答案 2 :(得分:0)
只想添加i80提到的方法并在MongoDB 3.2.3上运行