意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

MongoDb中怎么控制用户权限

来源:恒创科技 编辑:恒创科技编辑部
2023-12-03 16:32:59

今天就跟大家聊聊有关MongoDb中怎么控制用户权限,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Mongodb创建用户的语法在不用的版本之间还是不一样的。我这里使用的版本3.0.6。版本3.0之前使用的是db.addUser(),但3.0之后使用的是db.createUser()。3.0后版本中再使用db.addUser()会报如下错误:

>db.addUser('dba','dba')
2017-11-17T13:17:08.001+0800EQUERYTypeError:Property'addUser'ofobjectadminisnotafunction

如果数据库中还没有添加任何用户,要想新创建一个用户,要先把auth认证停掉,在进入数据库,也就是让auth=false。


MongoDb中怎么控制用户权限

[root@MidAppmongodb]#catmongodb.conf#配置文件
dbpath=/data/db
logpath=/usr/local/mongodb/logs/mongodb.log
logappend=true
port=27000
fork=true
auth=false
nohttpinterface=false
bind_ip=192.168.221.161
journal=false
quiet=true

登入数据库,只能看到一个库,看不到admin库:

[root@MidAppmongodb]#mongo192.168.221.161:27000
MongoDBshellversion:3.0.6
connectingto:192.168.221.161:27000/test
>showdbs
local0.078GB

现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,mongodb帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)

>useadmin
switchedtodbadmin
>db.createUser({user:"dba",pwd:"dba",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfullyaddeduser:{
"user":"dba",
"roles":[
{
"role":"userAdminAnyDatabase",
"db":"admin"
}
]
}
>db.system.users.find()
{"_id":"admin.dba","user":"dba","db":"admin","credentials":{"SCRAM-SHA-1":{"iterationCount":10000,"salt":"MXvU7oJanxW7gPw+NwI7rw==","storedKey":"lTPmK31qbk1YKmx5stmYiphsQZE=","serverKey":"gVovcstiwC0nuU6LTXZAiWkucfA="}},"roles":[{"role":"userAdminAnyDatabase","db":"admin"}]}
>db.system.users.find().pretty()
{
"_id":"admin.dba",
"user":"dba",
"db":"admin",
"credentials":{
"SCRAM-SHA-1":{
"iterationCount":10000,
"salt":"MXvU7oJanxW7gPw+NwI7rw==",
"storedKey":"lTPmK31qbk1YKmx5stmYiphsQZE=",
"serverKey":"gVovcstiwC0nuU6LTXZAiWkucfA="
}
},
"roles":[
{
"role":"userAdminAnyDatabase",
"db":"admin"
}
]
}

可以看到创建了一个用户dba,密码dba,拥有admin库的userAdminAnyDatabase角色。下面看一下mongodb中的内置角色:

1.数据库用户角色:read、readWrite;
2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色:backup、restore;
5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色:root
//这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner、userAdmin、userAdminAnyDatabase)
7.内部角色:__system

看一下具体的角色定义:

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

我们打开auth参数,来验证一下。

[root@MidAppmongodb]#mongo192.168.221.161:27000
MongoDBshellversion:3.0.6
connectingto:192.168.221.161:27000/test
>showdbs#没有验证,不会有权限
2017-11-17T13:04:35.357-0800EQUERYError:listDatabasesfailed:{
"ok":0,
"errmsg":"notauthorizedonadmintoexecutecommand{listDatabases:1.0}",
"code":13
}
atError(<anonymous>)
atMongo.getDBs(src/mongo/shell/mongo.js:47:15)
atshellHelper.show(src/mongo/shell/utils.js:630:33)
atshellHelper(src/mongo/shell/utils.js:524:36)
at(shellhelp2):1:1atsrc/mongo/shell/mongo.js:47
>useadmin#在admin库下面添加的账号,所以要切到admin下面认证
switchedtodbadmin
>db.auth('dba','dba')
1
>showdbs
admin0.078GB
local0.078GB

可以看到,创建的dba用户已经验证成功。接下来我在创建两个用户,验证一下其他角色权限。创建一个只读用户,一个读写用户。

>usetest;
switchedtodbtest
>db.createUser({user:"zduser",pwd:"zduser",roles:[{role:"read",db:"test"}]})
Successfullyaddeduser:{
"user":"zduser",
"roles":[
{
"role":"read",
"db":"test"
}
]
}
>db.createUser({user:"dxuser",pwd:"dxuser",roles:[{role:"readWrite",db:"test"}]})
Successfullyaddeduser:{
"user":"dxuser",
"roles":[
{
"role":"readWrite",
"db":"test"
}
]
}
>showusers;
{
"_id":"test.zduser",
"user":"zduser",
"db":"test",
"roles":[
{
"role":"read",
"db":"test"
}
]
}
{
"_id":"test.dxuser",
"user":"dxuser",
"db":"test",
"roles":[
{
"role":"readWrite",
"db":"test"
}
]
}
>

在test库中创建一个集合,验证一下这两个用户权限:

>showtables;#userAdminAnyDatabase权限只针对用户管理,没有其他的权限
2017-11-17T13:47:39.845-0800EQUERYError:listCollectionsfailed:{
"ok":0,
"errmsg":"notauthorizedontesttoexecutecommand{listCollections:1.0}",
"code":13
}
atError(<anonymous>)
atDB._getCollectionInfosCommand(src/mongo/shell/db.js:646:15)
atDB.getCollectionInfos(src/mongo/shell/db.js:658:20)
atDB.getCollectionNames(src/mongo/shell/db.js:669:17)
atshellHelper.show(src/mongo/shell/utils.js:625:12)
atshellHelper(src/mongo/shell/utils.js:524:36)
at(shellhelp2):1:1atsrc/mongo/shell/db.js:646
>exit
bye
[root@MidAppmongodb]#mongo192.168.221.161:27000#重新登录一下
MongoDBshellversion:3.0.6
connectingto:192.168.221.161:27000/test
>usetest
switchedtodbtest
>db.tb1.insert({"a":1,"b":2})#先试着插入数据看看
WriteResult({
"writeError":{
"code":13,
"errmsg":"notauthorizedontesttoexecutecommand{insert:\"tb1\",documents:[{_id:ObjectId('5a0f595b3b6523dcb81d4f76'),a:1.0,b:2.0}],ordered:true}"
}
})
>db.auth('dxuser','dxuser')#用可读写的用户认证
1
>db.tb1.insert({"a":1,"b":2})#可以插入数据
WriteResult({"nInserted":1})
>db.tb1.insert({"a":11,"b":22})
WriteResult({"nInserted":1})
>db.tb1.insert({"a":111,"b":222})
WriteResult({"nInserted":1})
>db.tb1.find()
{"_id":ObjectId("5a0f597f3b6523dcb81d4f77"),"a":1,"b":2}
{"_id":ObjectId("5a0f59933b6523dcb81d4f78"),"a":11,"b":22}
{"_id":ObjectId("5a0f59983b6523dcb81d4f79"),"a":111,"b":222}
>db.auth('zduser','zduser')#切换只读用户
1
>db.tb1.insert({"a":1111,"b":2222})#没有权限插入数据
WriteResult({
"writeError":{
"code":13,
"errmsg":"notauthorizedontesttoexecutecommand{insert:\"tb1\",documents:[{_id:ObjectId('5a0f59c63b6523dcb81d4f7a'),a:1111.0,b:2222.0}],ordered:true}"
}
})
>db.tb1.find()#可以查看数据
{"_id":ObjectId("5a0f597f3b6523dcb81d4f77"),"a":1,"b":2}
{"_id":ObjectId("5a0f59933b6523dcb81d4f78"),"a":11,"b":22}
{"_id":ObjectId("5a0f59983b6523dcb81d4f79"),"a":111,"b":222}
>

看完上述内容,你们对MongoDb中怎么控制用户权限有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恒创行业资讯频道,感谢大家的支持。

上一篇: mysql直接拷贝data目录下数据库源文件还原数据库方法 下一篇: JavaScript单线程和任务队列是什么