Mongodb 权限控制以及角色使用
参考:http://docs.mongodb.org/manual/reference/built-in-roles
MongoDB通过基于角色的授权授予对数据和命令的访问权限,并提供内置角色,提供数据库系统中通常需要的不同访问级别。 还可以创建用户定义的角色。
关键字
MongoDB中的权限关键字。
要理解清楚MongoDB的权限必须先了解如下一些关键字.
user
即用户,用于提供客户端连接MongoDB的认证账户。
role
即角色,数据权限的集合,创建用户的时候必须要指定对应的角色,否则用户无法操作数据库。
resource
即资源,包括database或collection也可以是database和collection的组合。例如:{ db: <database>, collection: <collection> },当然你也可能看到一种特殊的资源:{“cluster” : true},它其实表示的是全局资源。
actions
即权限操作,”actions” 定义了”user”能够对 “resource document”执行的操作。例如,增删改查包括如下操作:find、insert、remove、update。
privilege
即权限,”privilege” 是一组”resource” 和 “actions” 的组合。
authenticationDatabase
认证库,即创建角色或用户时所在的库。例如,在admin下创建了MongoDB用户那么登陆的时候需要指定认证库为admin
即:mongo -host host:port --authenticationDatabase admin -u user -p password
MongoDB user的role
连接MongoDB,进入admin库,执行db.system.users.find().pretty()查看当前数据库所用用户。
如下面的xxx用户即为其中之一,我们可以看到这个user中有一个roles的列表。roles表示xxx用户拥有的就是对某一资源的权限的“集合”。
{
"_id" : "admin.xxx",
"user" : "xxx",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "kf1gjwLtDyhqZNv479nTnA==",
"storedKey" : "BURWrcFnUCeEk7JvV3JE+gpkEo4=",
"serverKey" : "Au29WWeX9ElqWltB/Mt7qnKIk4E="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
MongoDB的内置角色
(1).数据库用户角色
针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.
示例:下面代码表示,user test在db:test下有readWrite权限。
db.createUser(
{
user:"test",
pwd:"test",
roles:
[
{
role:"readWrite",
db:"test"
}
]
}
);
(2).数据库管理角色
每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。
(3).集群管理权限
admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。
(4).所有数据库角色
admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。和read相似,但它是全局。的。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
(5). 超级管理员权限
root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。
(6). 备份恢复角色:backup、restore;
(7). 内部角色:__system
自定义角色
MongoDB除了内置角色外,还有可以自定义角色。
use admin
db.createRole(
{ role:"test",
privileges: [
{
resource: {
db:"test",
collection:""
},
actions: [ "find", "insert", "remove","update" ]
}
],
roles: [ ]
}
)
上述语句在admin库里创建了一个名为test的角色,该角色拥有有对test库下的所有集合进行 find、insert、remove、update的操作的权限。角色创建完毕后 MongoDB的admin 下创建一个系统collection名叫system.roles 里面存储的即是角色相关的信息。可以使用db.system.roles.find();进行查看。
常用命令
创建用户
如创建用户管理员:
用户管理员是第一个要创建的用户。role为userAdminAnyDatabase,它拥有userAdmin每一个具有userAdmin每一个数据库权限。
命令为:
db.createUser(
{
user:"test1",
pwd:"test1",
roles:
[
{
role:"userAdminAnyDatabase",
db:"admin"
}
]
}
);
删除用户
db.dropUser('test1')
查看所有用户
use admin
db.system.users.find().pretty()
查看role
show roles;
如果知道具体role的权限:
db.getRole("read",{showPrivileges: true});
查看自定义role:
db.system.roles.find();
推荐阅读
-
asp.net core 使用 AccessControlHelper 控制访问权限
-
使用Spring安全表达式控制系统功能访问权限
-
ThinkPHP的RBAC(基于角色权限控制)深入解析
-
centos的安装与配置,Linux下基本命令、权限控制,解压缩文件以及软件的安装与卸载
-
Angular2使用Guard和Resolve进行验证和权限控制
-
Angular中使用ui router实现系统权限控制及开发遇到问题
-
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
-
MongoDB的基本使用以及增删改查
-
使用 Casbin 作为 ThinkPHP 的权限控制中间件
-
MongoDB 4.X 用户和角色权限管理总结