MongoDB的“root”用户

91
8个回答

119

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

use admin

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

了解更多细节,请查看内置角色。


4
谢谢 - 这里的“admin database”是连接数据库。 - danday74
我看到有些人在“roles”属性中使用“db”。那么,如果我们没有“db”怎么办? 我创建了用户并分配了角色“root”,但是db:'admin',现在我无法使用mongoose访问其他集合。你能展示一下如何解决这个问题吗?因为我对这种技术还不熟悉。 - chourn solidet
另外,如果从“--eval”运行命令,则必须在“createUser”之前使用“db.getSiblingDB(“admin”)”,否则它将在默认测试数据库中创建管理员根用户,这通常不是我们想要的。 - JustAMartin
使用 createUser 方法创建 root 用户时,您需要在数据库管理员下进行操作。因此,在使用 createUser 方法之前,请首先在 mongo shell 中键入 "use admin"。如果您没有进行这个步骤,您可能会遇到以下错误提示:"uncaught exception: Error: couldn't add user: No role named root@something"。 - chrisweb

104

虽然MongoDB默认不启用身份验证,但您可以通过将“任何”角色授予特定用户来创建类似于管理员/超级用户的帐户,从而实现身份验证。授权操作针对admin数据库进行。

以下是一个示例:

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

] } )

2.6+版本更新

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

提供了readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase和clusterAdmin角色的所有操作和资源访问权限。

root没有包括任何以system.前缀开头的集合的访问权限。

3.0+版本更新

使用db.createUser替代db.addUser

3.0.7+版本更新

root不再具有上述限制。

root现在在系统集合上具有验证特权。之前,root并没有包括任何以system.前缀开头的集合的访问权限,除了system.indexes和system.namespaces。


5
自2.6版以来,addUser已被弃用。 在3.2.3中,我使用了db.createUser。 - jorfus
1
自版本3.0.7起更改:root在system.collections上具有验证操作。 以前,root不包括对以system.前缀开头的集合的任何访问权限,除了system.indexes和system.namespaces。 - rocksteady
一些错误: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 - Ashfaq Muhammad
1
我更喜欢@Jerry的答案。 - user8389458

31

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 - Ashfaq Muhammad
查询: user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); ``` 结果: ```成功添加用户:{ "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }``` - KARTHIKEYAN.A
你在系统中创建了userAdminAnyDatabase规则吗?还是它已经存在于系统中?为什么我的系统中没有它?我正在使用CentOS 7。 - Ashfaq Muhammad

10

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


2
是的,只是为了记录, root 角色是在 MongoDB 2.6 中引入的。 - SolarBear

4

我注意到许多答案都使用了这个命令:

use admin

切换到管理数据库。在Mongo v4.0.6中,在管理数据库上下文中创建用户将创建一个带有"_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 adapter)的应用程序,并且我使用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命令,通常用于更新用户密码。


0
现在你可以在控制台中将内置角色更改为Atlas管理员;这解决了我的问题。

Atlas admin location


0

通常的做法是为整个系统使用一个仅用于身份验证数据的单个数据库。 在连接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"
    } ] });

-1
"userAdmin 是特定数据库的超级用户角色。拥有 userAdmin 权限的用户可以授予自身所有权限。然而,userAdmin 并未明确授权用户除用户管理外的任何权限。"来自您发布的链接

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