MongoDB:了解createUser和db admin

时间:2015-08-07 09:19:56

标签: mongodb shell authentication admin database

我的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.

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

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

导致错误:

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

4 个答案:

答案 0 :(得分:15)

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"}] })

角色为userAdminAnyDatabase的用户可以管理所有数据库的用户。

现在再次启用auth并重启服务。

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

顺便说一句,我发表了关于MongoDB 3.0 auth的an article on Medium

答案 1 :(得分:3)

这解决了我的问题:

  

我终于让它在compose.io上工作了!所以这就是我的oplog网址最终看起来像:   &#34; MONGO_OPLOG_URL&#34;:&#34; mongodb://用户名:password@single.18.mongolayerhost.com:1111 / local?authSource = myDB&#34;
  我保持MONGO_URL与URL compose.io提供的完全相同?replicaSet
  但对于OPLOG_URL,您只能使用单个主机,而不能使用多个主机。所以你必须编辑URL compose.io让你只有一个主机。并且您无法使用?replicaSet结束oplog。你只能在MONGO_URL中拥有?replicaSet。

source

答案 2 :(得分:2)

设置身份验证的流程:

  1. 在没有访问控制的情况下启动MongoDB。

    mongod --port 27017 --dbpath / data / db1

  2. 连接到实例。

    mongo-端口27017

  3. 创建用户管理员。

use admin
    db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
  1. 使用访问控制重新启动MongoDB实例。

    mongod --auth --port 27017 --dbpath / data / db1

  2. 以用户管理员身份验证。

    使用-u,-p和--authenticationDatabase命令行选项启动mongo shell:

  

mongo --port 27017 -u“ myUserAdmin” -p“ abc123”   --authentication数据库“管理员”

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

对于常规用户创建,您必须拥有以下权限:

To create a new user in a database, you must have the createUser action on that database resource.
To grant roles to a user, you must have the grantRole action on the role’s database.

MongoDB将所有用户信息(包括名称,密码和用户的身份验证数据库)存储在admin数据库的system.users集合中。

更多详细信息:https://docs.mongodb.com/manual/tutorial/enable-authentication/

答案 3 :(得分:0)

您可以尝试以下方法:

   use admin
   db.createUser( { user: "kaka", pwd: "hamedkke", roles: [ 
   "readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin" ] } )