MongoDB“ root”用户


Answers:


92

开箱即用时,MongoDb不进行身份验证,您可以通过对admin数据库的特定用户使用“ any”角色来创建与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用户不包括对以系统开头的集合的任何访问。除system.indexes和system.namespaces以外的前缀。


5
自3.2.3上的2.6版以来,不推荐使用addUser
jorfus

1
从此链接Changed 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.
rocksteady

某些错误:db.createUser({用户:“ dev1”,pwd:“通过”,角色:[{角色:“ userAdminAnyDatabase”,db:“ xxxxxxx”}]})); 2018-02-26T16:59:28.688 + 0500 E查询[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的答案。

89

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

use admin

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

有关更多详细信息,请查看内置角色。

希望这可以帮助 !!!


4
谢谢-管理数据库是这里的连接数据库
danday74 '16

我看到有人在“角色”属性中使用“ db”。那么,如果我们没有'db'怎么办?我创建了用户,并分配了角色“ root”,但分配了db:“ admin”,现在我无法使用猫鼬访问其他集合。您能展示如何解决这个问题吗,因为我对这种技术很熟悉。
chourn solidet

另外,如果从运行命令--eval,则必须使用db.getSiblingDB("admin")before createUser,否则它将在默认的测试数据库中创建管理员根用户,这不是我们通常想要的。
JustAMartin

26

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”,角色:[{角色:“ userAdminAnyDatabase”,db:“ xxxxxxx”}]})); 2018-02-26T16:59:28.688 + 0500 E查询[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

查询: db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); 结果: Successfully added user: { "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
KARTHIKEYAN.A,

您是否在系统中创建过userAdminAnyDatabase规则,或者该规则已经存在?为什么它不在我的系统中。我正在使用centOS 7
Ashfaq Muhammad

6

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


2
是的,仅作记录,该root角色已在MongoDB 2.6中引入。
SolarBear 2014年

2

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

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​​适配器)应用程序,其数据库与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命令,通常用于更新用户密码。


-1

“ userAdmin实际上是特定数据库的超级用户角色。具有userAdmin的用户可以向自己授予所有特权。但是,userAdmin并未明确授权用户具有除用户管理之外的任何特权。” 从您发布的链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.