加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

MongoDB内建角色包括哪些?特性是什么?

发布时间:2023-08-18 15:10:51 所属栏目:系统 来源:
导读: MongoDB内建角色包括哪些?特点是什么?刚接触MongoDB的朋友可能对于MongoDB内建角色不太了解,对此这篇文章就主要给大家介绍一下MongoDB内建角色,感兴趣的朋友就继续往下看吧。

想要了解内建角色,还是
 MongoDB内建角色包括哪些?特点是什么?刚接触MongoDB的朋友可能对于MongoDB内建角色不太了解,对此这篇文章就主要给大家介绍一下MongoDB内建角色,感兴趣的朋友就继续往下看吧。
 
       想要了解内建角色,还是少不了下面这张图,在MongoDB中,用户的权限是通过角色绑定的方法来分配的。把某个角色绑定在某个用户上,那么这个用户就有这个角色对应的权限了。
 
       这里对上面的内建角色所拥有的权限做以说明:
 
       数据库用户角色:
 
       read:用于读取所有非系统集合,以及下面三个系统集合:
 
       system.indexes、system.js以及system.namesp
 
       readWrite:拥有read角色的所有权限,并且可以修改所有非系统集合和system.js集合上的数据
 
       数据库管理角色:
 
       dbAdmin:提供管理相关功能,例如查询统计信息,索引管理等
 
       userAdmin:提供管理数据库角色及用户的权限,具有这个角色的用户可以为当前数据库的任何用户,包括自己,分配任何角色和权限
 
       dbOwner:提供数据库所有者的权限,它可以对数据库进行任何管理操作,这个角色结合了readWrite、dbAdmin、userAdmin三种角色授予的权限。
 
       集群管理角色:
 
       此类角色提供了管理整个MongoDB的权限,角色只能在admin数据库中进行授权。
 
       clusterManager:提供对集群进行管理和监控的权限
 
       clusterMonitor:提供对监控工具的只读访问权限
 
       hostManager:提供监控和管理服务器的权限
 
       clusterAdmin:提供最高的集群管理访问权限,这个角色拥有clusterManager、clusterMonitor和hostManager角色授予的权限,除此之外,它还具有dropDatabase()权限
 
       备份和恢复角色:
 
       此类角色只能在admin数据库中备份和恢复。
 
       backup:提供备份数据的权限,使用mongodump备份整个mongod实例
 
       restore:提供还原数据库所需的权限,使用户可以通过mongorestore恢复数据
 
       全数据库角色
 
       全数据库角色用于管理所有自定义数据库,但是不包含local和config数据库,它只能被授予在admin用户下。
 
       超级用户:
 
       root,这个不需要过多解释。
 
       用户只能在admin数据库中配置这个权限,拥有这个角色的用户可以对所有数据库进行任何操作。
 
       内部角色:
 
       __system仅仅用于MongoDB内部的管理,不建议将这个权限分配个用户,防止用户对内部系统进行操作。
 
       MongoDB中的角色特点
 
在MongoDB中,授予用户某个角色的权限时,默认授予当前数据库
 
角色授权可以授予集合级别的粒度
 
角色授权分成系统集合以及非系统集合的访问权限
 
每个数据库中的角色都可以分成一般角色和管理角色
 
管理数据库可以使用所有的内建角色
 
       NO.2 创建自定义角色
 
       上面的内容,更多的是讲述怎样使用内建角色,这里我们来看创建自定义角色的,
 
       自定义角色有如下三个特点:
 
       1、在一般数据库上创建的角色,只适用于当前数据库
 
       2、在admin数据库上创建的角色,可适用于所有数据库
 
       3、创建角色时,角色名字不能重复,否则报错alread exist
 
       例如我们想给一个账号分配insert,update、select、而不给delete权限。
 
       语法:
 
db.createRole(
 
{
 
 role:"<name>",
 
 privileges:[
 
       {resource:{<resource>},actions:["action",...]}
 
      ],
 
 roles:[
 
     {role:"<role>",db:"<database>"}|"<role>"
 
    ],
 
 authenticationRestrictions:[
 
               {clientSource:["<IP 地址>"|"<CIDR range>",...],
 
               {serverAddress:["<IP 地址>"|"<CIDR range>",...]}
 
              ]
 
}
 
)
 
       其中,resource为指定数据库或者集合,若设置为空,则默认当前数据库的全部集合。
 
       actions:指定权限
 
       范例:
 
       1、首先我们创建一个角色:
 
use admin
 
db.createRole(
 
{
 
 role:"role_yeyz",
 
 privileges:[
 
       {resource:{db:"yeyz",collection:"test"},
 
       actions:["find","insert","update"]
 
       }
 
      ],
 
 roles:[
 
     {role:"read",db:"yeyz1"}
 
    ]
 
}
 
)
 
       这个角色的名字叫做role_yeyz,它具有yeyz这个数据库下面的test集合的查找、插入、更新权限。同时它集成了系统的内建权限read,内建权限的生效数据库是yeyz1
 
       2、使用show roles查看当前角色的创建情况
 
use admin
 
show roles
 
{
 
    "role" : "role_yeyz",
 
    "db" : "admin",
 
    "isBuiltin" : false,
 
    "roles" : [
 
        {
 
            "role" : "read",
 
            "db" : "yeyz1"
 
        }
 
    ],
 
    "inheritedRoles" : [
 
        {
 
            "role" : "read",
 
            "db" : "yeyz1"
 
        }
 
    ]
 
}
 
       这里它只显示了内建角色的信息,注意,这个角色所在的db是admin
 
       3、此时我们将这个角色,授予给一个新的用户,yeyz_1
 
> db.createUser(
 
... {
 
... user: "yeyz_1",
 
... pwd: "123456",
 
... roles: [ { role: "role_yeyz", db: "admin" }]
 
... }
 
... )
 
Successfully added user: {
 
    "user" : "yeyz_1",
 
    "roles" : [
 
        {
 
            "role" : "role_yeyz",
 
            "db" : "admin"
 
        }
 
    ]
 
}
 
       我们创建了一个新的用户yeyz_1,这个用户继承了我们第一步的自定义角色role_yeyz
 
       4、开始认证并执行相关操作。
 
[root@VM-0-14-centos ~]# mongo
 
MongoDB shell version v4.0.6
 
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
 
Implicit session: session { "id" : UUID("b9daecb8-ffd8-44a7-8af0-d1115057539a") }
 
MongoDB server version: 4.0.6
 
> use admin
 
switched to db admin
 
> db.auth("yeyz_1","123456")
 
1
 
> use yeyz
 
switched to db yeyz
 
### 测试查找,成功
 
> db.test.find()
 
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "aaa" }
 
### 测试插入,成功
 
> db.test.insert({"name":"bbb"})
 
WriteResult({ "nInserted" : 1 })
 
> db.test.find()
 
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "aaa" }
 
{ "_id" : ObjectId("5fa7f00e523d80402cdfa326"), "name" : "bbb" }
 
### 测试更新,成功
 
> db.test.update({"name":"aaa"},{$set:{"name":"ccc"}})
 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
 
>
 
> db.test.find()
 
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "ccc" }
 
{ "_id" : ObjectId("5fa7f00e523d80402cdfa326"), "name" : "bbb" }
 
### 测试删除,失败,和我们预期一致,因为role_yeyz这个角色,没有删除权限。
 
> db.test.remove({"name":"bbb"})
 
WriteCommandError({
 
    "ok" : 0,
 
    "errmsg" : "not authorized on yeyz to execute command { delete: \"test\", ordered: true, lsid: { id: UUID(\"b9daecb8-ffd8-44a7-8af0-d1115057539a\") }, $db: \"yeyz\" }",
 
    "code" : 13,
 
    "codeName" : "Unauthorized"
 
})
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!