我需要哪些MongoDB用户权限才能将用户添加到一个新的/另一个Mongo数据库?

16

在添加一个拥有以下权限的管理员用户:userAdminuserAdminAnyDatabase 后,我已经在 MongoDB 配置文件中启用了身份验证。

现在,我使用这个用户连接到定义此管理员用户的数据库(否则会出现 exception: login failed 的错误)。

成功连接后,我想要在一个新的数据库中添加一个新的用户。为此,我尝试执行以下操作:

use another
db.addUser(...)

但是我收到一个错误:

Wed Dec 11 17:45:18.277 couldn't add user: not authorized for insert on app.system.users at src/mongo/shell/db.js:128

我该如何创建一个新的数据库并添加第一个用户?


详细说明(在这个示例中,所有用户的密码都是1234)

$ mongo mono -u admin_all -p 1234
MongoDB shell version: 2.4.6
connecting to: mono
> db.system.users.find()
{ "_id" : ObjectId("52a9831de41eb640bb0f5f64"), "user" : "admin_all", "pwd" : "a6316ed4886c10663cce46bc216ea375", "roles" : [  "userAdmin",  "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("52a98404ef1f9bc934b62e11"), "user" : "admin_one", "pwd" : "884f516cf308a4c6a75bbc5a0a00807b", "roles" : [  "userAdmin" ] }
{ "_id" : ObjectId("52a98415ef1f9bc934b62e12"), "user" : "admin_any", "pwd" : "1616611df9b47c58b607054d384cab99", "roles" : [  "userAdminAnyDatabase" ] }
> use another
switched to db another
> db.addUser({ user: "user", pwd: "1234", roles: ["read"] })
{
    "user" : "user",
    "pwd" : "461d4f349d8d4ec3d22a4c945010c330",
    "roles" : [
        "read"
    ],
    "_id" : ObjectId("52a985372fcdbfd033003a7e")
}
Thu Dec 12 10:43:19.091 couldn't add user: not authorized for insert on another.system.users at src/mongo/shell/db.js:128

请提供admin db system.users记录以及数据库addUser实际使用的命令。请更改这些密码。如果语法正确,您正在遵循的过程应该有效。 - James Wahlin
@JamesWahlin 我已经添加了我得到的详细输出。我还在这里报告了这个问题(https://jira.mongodb.org/browse/SERVER-12062) - Gabriel Petrovay
如果直接登录到 "db.another",例如:mongo another -u admin_all -p 123,然后尝试添加 addUser 呢? - john Smith
不起作用,但是刚刚找到了解决方案。 - Gabriel Petrovay
2个回答

39
犯的错误是我使用了一个userAdminAnyDatabase用户,但该用户不在admin数据库中(请参阅此注释)。因此,在您的服务器上必须有一个名为admin的数据库!正如文档对于“AnyDatabase”权限所述:

如果将这些角色中的任何一个添加到admin数据库之外的用户权限文档中,则该权限将无效。

因此,您必须:
  • admin数据库添加userAdminAnyDatabase用户

    $ mongo admin
    > db.createUser({ user: "myadmin", pwd: "1234", roles: ["userAdminAnyDatabase"] })
    
  • 打开身份验证

    auth = true
    setParameter = enableLocalhostAuthBypass=0
    
  • 使用新的myadmin用户连接到任何数据库,并添加其他用户:

  • $ mongo another -u myadmin -p 1234
    > db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
    
    或者
    > use another
    > db.createUser({ user: "user", pwd: "1234", roles: ["readWrite"] })
    

2
我曾经为此苦苦挣扎了一段时间。最终我使用了MongoChef。首先,我在mongo配置中禁用了auth。然后,我通过MongoChef创建了一个SSH隧道连接到我的Amazon EC2实例的Mongo DB。从那里,我设置了权限,重新启动了mongo,一切都运行良好。我甚至能够将本地集合导出到远程实例中。 - ChrisRich
太好了!顺便说一下,我不需要执行第二步。 - Luís Soares
4
现在返回警告信息:'addUser' shell 辅助工具已过时,请使用 'createUser' 替代。 - Erdinç Çorbacı
我应该在哪里设置enableLocalhostAuthBypass=0?是在配置文件中吗? - Bill Yan
在Kubernetes中使用社区控制器如何在Mongo中实现这个? - Arrow_Raider

0

以下是我用来创建一个名为prod的用户并连接到数据库prod的方法,假设我已经有了一个名为admin的管理员用户在MongoDB中:

> mongo admin --username root --password <pwd>
> use prod
> db.createUser(
  {
    user: "prod",
    pwd: "<pwd>",
    roles: [ { role: "dbOwner", db: "prod" } ]
  }
)
> exit

完成上述步骤后,您可以使用新用户prod进行登录,方式如下:

> mongo prod  --username prod --password <pwd>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接