ChatGPT解决这个技术问题 Extra ChatGPT

MongoDB 是否有类似“root”用户的超级 UNIX?我一直在查看 http://docs.mongodb.org/manual/reference/user-privileges/ 并尝试了许多组合,但它们似乎都缺少某个区域。肯定有一个角色高于那里列出的所有角色。


J
Jerry

最好的超级用户角色是 root。语法是:

use admin

db.createUser(
{
    user: "root",
    pwd: "password",
    roles: [ "root" ]
})

有关详细信息,请参阅 built-in roles.

希望这可以帮助 !!!


谢谢 - 管理员数据库是这里的连接数据库
我看到有些人在“角色”属性中使用“db”。那么,如果我们没有 'db' 怎么办?我创建了用户并分配了角色“root”但 db:“admin”,现在我无法使用 mongoose 访问其他集合。你能告诉我如何解决这个问题,因为我对这种技术很陌生。
另外,如果从 --eval 运行命令,您必须在 createUser 之前使用 db.getSiblingDB("admin"),否则它将在默认测试数据库中创建 admin root 用户,这不是我们通常想要的。
使用 createUser 方法创建 root 用户时,您需要在数据库管理员中,因此首先在 mongo shell 中键入“use admin”,然后您可以使用 createUser 方法,否则您可能会收到此错误:"未捕获的异常:错误:无法添加用户:没有名为 root@something 的角色
c
char1es

虽然开箱即用,MongoDb 没有身份验证,但您可以通过对 admin 数据库的特定用户使用“任何”角色来创建等效的 root/超级用户。

像这样的东西:

use admin
db.addUser( { user: "<username>",
          pwd: "<password>",
          roles: [ "userAdminAnyDatabase",
                   "dbAdminAnyDatabase",
                   "readWriteAnyDatabase"

] } )

2.6+ 更新

虽然 2.6 中有一个新的 root 用户,但您可能会发现它不能满足您的需求,因为它仍然有一些限制:

提供对 readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase 和 clusterAdmin 角色组合的操作和所有资源的访问。 root 不包括对以系统开头的集合的任何访问。字首。

3.0+ 更新

db.createUser 用作 db.addUser 已删除。

3.0.7+ 更新

root 不再具有上述限制。

root 对系统具有验证权限操作。收藏品。以前,root 不包括对以系统开头的集合的任何访问。 system.indexes 和 system.namespaces 以外的前缀。


addUser 自 2.6 以来已弃用 3.2.3 我使用 db.createUser
from this linkChanged in version 3.0.7: The root has validate action on system. collections. Previously, root does not include any access to collections that begin with the system. prefix other than system.indexes and system.namespaces.
一些错误: db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "xxxxxxx" } ] }); 2018-02-26T16:59:28.688+0500 E QUERY [thread1] 错误:无法添加用户:没有名为 userAdminAnyDatabase@xxxxxx 的角色:_getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype。 createUser@src/mongo/shell/db.js:1267:15 @(shell):1:1
我更喜欢@Jerry 的回答。
K
KARTHIKEYAN.A

MongoDB用户管理:

角色列表:

read
readWrite
dbAdmin
userAdmin
clusterAdmin
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase

创建用户:

db.createUser(user, writeConcern)

db.createUser({ user: "user",
  pwd: "pass",
  roles: [
    { role: "read", db: "database" } 
  ]
})

更新用户:

db.updateUser("user",{
  roles: [
    { role: "readWrite", db: "database" } 
  ]
})

删除用户:

db.removeUser("user")

或者

db.dropUser("user")

查看用户:

db.getUsers();

更多信息: https://docs.mongodb.com/manual/reference/security/#read


db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "xxxxxxx" } ] }); 2018-02-26T16:59:28.688+0500 E QUERY [thread1] 错误:无法添加用户:没有名为 userAdminAnyDatabase@xxxxxx 的角色:_getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype。 createUser@src/mongo/shell/db.js:1267:15 @(shell):1:1
查询: db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); 结果: Successfully added user: { "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
您是否在系统中创建了 userAdminAnyDatabase 规则或者它已经存在?为什么它不在我的系统中。我正在使用centOS 7
a
ahyong

有一个超级用户角色:root,它是一个内置角色,可以满足您的需要。


是的,为了记录,在 MongoDB 2.6 中引入了 root 角色。
D
Daniel Viglione

我注意到很多这些答案,请使用以下命令:

use admin

切换到管理数据库。至少在 Mongo v4.0.6 中,在 admin 数据库的上下文中创建用户将使用 "_id" : "admin.administrator" 创建一个用户:

> use admin
> db.getUsers()
[ ]
> db.createUser({ user: 'administrator', pwd: 'changeme', roles: [ { role: 'root', db: 'admin' }  ] })
> db.getUsers()
[
    {
        "_id" : "admin.administrator",
        "user" : "administrator",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]

我强调 "admin.administrator",因为我有一个 Mongoid(mongodb ruby 适配器)应用程序,它的数据库与 admin 不同,我使用 URI 在我的 mongoid.yml 配置中引用数据库:

development:
  clients:
    default:
      uri: <%= ENV['MONGODB_URI'] %>
      options:
        connect_timeout: 15
        retry_writes: false

这引用了以下环境变量:

export MONGODB_URI='mongodb://administrator:changeme@127.0.0.1/mysite_development?retryWrites=true&w=majority'

请注意,数据库是 mysite_development,而不是 admin。当我尝试运行该应用程序时,我收到一条错误消息“用户管理员(机制:scram256)无权访问 mysite_development”。

于是我回到Mongo shell删除用户,切换到指定数据库,重新创建用户:

$ mongo
> db.dropUser('administrator')
> db.getUsers()
[]
> use mysite_development
> db.createUser({ user: 'administrator', pwd: 'changeme', roles: [ { role: 'root', db: 'admin' }  ] })
> db.getUsers()
[
    {
        "_id" : "mysite_development.administrator",
        "user" : "administrator",
        "db" : "mysite_development",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]

请注意,_id 和 db 更改为引用我的应用程序所依赖的特定数据库:

"_id" : "mysite_development.administrator",
"db" : "mysite_development",

进行此更改后,错误消失了,我能够在我的应用程序中正常连接到 MongoDB。

额外说明:

在上面的示例中,我删除了用户并在正确的数据库上下文中重新创建了用户。如果您已经在正确的数据库上下文中创建了用户,但给了它错误的角色,您可以为用户分配一个 mongodb 内置角色:

db.grantRolesToUser('administrator', [{ role: 'root', db: 'admin' }])

还有一个 db.updateUser 命令,albiet 通常用于更新用户密码。


D
Dharman

通常的做法是拥有一个仅用于整个系统的身份验证数据的数据库。在连接 uri 上,除了指定要连接使用的数据库外,还可以指定要进行身份验证的数据库。

“mongodb://usreName:passwordthatsN0tEasy2Gue55@mongodb.myDmoain.com:27017/enduserdb?authSource=myAuthdb”

这样您就可以在该单个身份验证数据库中创建所有用户凭据和角色。如果你想要一个数据库上的所有超级用户,那么你只需给他们“root@thedbinquestion”的角色,例如......

use admin
db.runCommand({ 
"updateUser" : "anAdminUser", 
"customData" : {

}, 
"roles" : [
    {
        "role" : "root", 
        "db" : "thedbinquestion"
    } ] });

L
Lakmal Vithanage

“userAdmin 实际上是特定数据库的超级用户角色。具有 userAdmin 的用户可以授予自己所有权限。但是,userAdmin 没有明确授权用户获得用户管理之外的任何权限。”来自the link you posted