MongoDB是否有像“ root”用户这样的超级UNIX用户?我一直在看http://docs.mongodb.org/manual/reference/user-privileges/,并尝试了许多组合,但它们似乎都缺少某个区域或另一个区域。当然,在这里列出的所有角色中,首先要有一个角色。
MongoDB是否有像“ root”用户这样的超级UNIX用户?我一直在看http://docs.mongodb.org/manual/reference/user-privileges/,并尝试了许多组合,但它们似乎都缺少某个区域或另一个区域。当然,在这里列出的所有角色中,首先要有一个角色。
Answers:
开箱即用时,MongoDb不进行身份验证,您可以通过对admin
数据库的特定用户使用“ any”角色来创建与root /超级用户等效的身份。
像这样:
use admin
db.addUser( { user: "<username>",
pwd: "<password>",
roles: [ "userAdminAnyDatabase",
"dbAdminAnyDatabase",
"readWriteAnyDatabase"
] } )
尽管2.6中有一个新的root用户,但是您仍然会发现它不符合您的需求,因为它仍然有一些限制:
提供对readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase和clusterAdmin角色组合的操作和所有资源的访问。
root不包括对以系统开头的集合的任何访问。字首。
使用db.createUser
方式db.addUser
已删除。
根不再具有上述限制。
根对系统具有“验证”特权操作。集合。以前,root用户不包括对以系统开头的集合的任何访问。除system.indexes和system.namespaces以外的前缀。
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.
--eval
,则必须使用db.getSiblingDB("admin")
before createUser
,否则它将在默认的测试数据库中创建管理员根用户,这不是我们通常想要的。
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: "admin" } ] });
结果: Successfully added user: { "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
我注意到很多这些答案,请使用以下命令:
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
命令,通常用于更新用户密码。
“ userAdmin实际上是特定数据库的超级用户角色。具有userAdmin的用户可以向自己授予所有特权。但是,userAdmin并未明确授权用户具有除用户管理之外的任何特权。” 从您发布的链接