是否存在类似于UNIX中的“root”用户的超级用户角色用于MongoDB?我一直在查看http://docs.mongodb.org/manual/reference/user-privileges/,并尝试了许多组合,但它们似乎都在某些方面缺失。肯定有一种角色高于所有列出的角色。
是否存在类似于UNIX中的“root”用户的超级用户角色用于MongoDB?我一直在查看http://docs.mongodb.org/manual/reference/user-privileges/,并尝试了许多组合,但它们似乎都在某些方面缺失。肯定有一种角色高于所有列出的角色。
虽然MongoDB默认不启用身份验证,但您可以通过将“任何”角色授予特定用户来创建类似于管理员/超级用户的帐户,从而实现身份验证。授权操作针对admin
数据库进行。
以下是一个示例:
use admin
db.addUser( { user: "<username>",
pwd: "<password>",
roles: [ "userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
] } )
尽管在2.6中有一个新的root用户,但您可能会发现它无法满足您的需求,因为它仍然有一些限制:
提供了readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase和clusterAdmin角色的所有操作和资源访问权限。
root没有包括任何以system.前缀开头的集合的访问权限。
使用db.createUser
替代db.addUser
。
root不再具有上述限制。
root现在在系统集合上具有验证特权。之前,root并没有包括任何以system.前缀开头的集合的访问权限,除了system.indexes和system.namespaces。
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
user: "dev1",
pwd: "pass",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}); ```
结果:
```成功添加用户:{
"user" : "user",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}```
- KARTHIKEYAN.A我注意到许多答案都使用了这个命令:
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
命令,通常用于更新用户密码。
通常的做法是为整个系统使用一个仅用于身份验证数据的单个数据库。 在连接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"
} ] });