MongoDB:了解createUser和db admin

Sen*_*nju 5 database authentication shell admin mongodb

我的MongoDB托管在compose.io上,名为ScroungeBA.我尝试创建一个具有一些内置角色的用户,这些角色由纪录片仅在admin数据库中工作:

MongoDB仅在管理数据库上提供所有其他内置角色

所以我的问题是:那个admin db是关于什么的?它是始终存在的标准数据库吗?

此外我遇到麻烦(使用MongoDB shell版本:3.0.5):

$ use admin
switched to db admin
$ db.auth("user", "secret")
Error: 18 Authentication failed.
Run Code Online (Sandbox Code Playgroud)

我想我的用户确实存在于ScroungeBA数据库中但不存在于admin数据库中?我如何在admin db中创建用户

db.createUser({user:"hello", pwd:"world", roles:[{role: "userAdmin", db: "admin"}]})
Run Code Online (Sandbox Code Playgroud)

导致错误:

Error: couldn't add user: not authorized on admin to execute command { createUser: "hello", pwd: "xxx", roles: [ { role: "userAdmin", db: "admin" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } }
at Error (<anonymous>)
at DB.createUser (src/mongo/shell/db.js:1101:11)
at (shell):1:4 at src/mongo/shell/db.js:1101
Run Code Online (Sandbox Code Playgroud)

mco*_*ont 17

admin数据库是您使用MongoDB实例自动拥有的特殊数据库.它包含数据库用户,角色,自定义数据等内容.

要在admin数据库中创建用户,您必须暂时禁用MongoDB实例上的auth.我不知道compose.io是如何工作的,但我通常会修改mongod.conf文件,并对该行进行注释auth=true.

之后,您可以连接到MongoDB shell并在admin数据库中创建用户.

为用户提供角色userAdminAnyDatabase而不仅仅是useAdmin.

use admin
db.createUser({ user:"admin", pwd: "pass", roles: [{role: "userAdminAnyDatabase", db: "admin"}] })
Run Code Online (Sandbox Code Playgroud)

具有该角色userAdminAnyDatabase的用户可以管理所有数据库的用户.

现在再次启用auth并重新启动服务.

正如我所说,我不确定compose.io实际上是如何工作的以及它给你的控制程度.如果您没有管理员帐户,这应该是可行的方法.

顺便说一下,我发表了一篇关于MongoDB 3.0 auth 的文章.