专栏首页DBA随笔MongoDB运维与开发(四)---用户权限管理2

MongoDB运维与开发(四)---用户权限管理2

//

MongoDB运维与开发(四)---用户权限管理

//

上次的文章中我们说到了MongoDB中的用户初始化,重点说了启用访问控制的方法、角色与用户的关系、用户的创建、修改、删除、查询方法、而且举了几个小的例子来说明上面的过程,今天我们来看用户的授权和权限回收。

MongoDB授权与回收权限

如何授予或者删除用户权限?

想要在已有的用户上添加角色或者权限,有下面该两种方法:

1、db.grantRolesToUser()

该方法将指定角色授予给自定义的用户,它的语法格式为:

db.grantRolesToUser("<username>",[<roles>],{<writeConcern>})

其中,writeConcern参数可选,后续我们会分析这个参数,这里不做赘述。

2、db.revokeRolesFromUser()

该方法将回收自定义角色的某些权限,它的语法格式为:

db.revokeRolesFromUser("<username>",[<roles>],{<writeConcern>})

下面我们来看他们的具体用法,先来看角色授权:

> db.system.users.find().pretty()
{
        "_id" : "admin.root",
        "user" : "root",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
{
        "_id" : "test.yeyz",
        "user" : "yeyz",
        "db" : "test",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "test"
                }
        ],
        "customData" : {
                "desc" : "this is user yeyz"
        }
}

可以看到,yeyz用户具有test库下面的read权限。我们来验证一下这个权限:

[root@VM-0-14-centos ~]# mongo -u "yeyz" -p "123456" --authenticationDatabase "test"
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?authSource=test&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("9d4929be-e7f0-46bf-9fa6-4d37e5a84ad1") }
MongoDB server version: 4.0.6
> 
> show dbs
test  0.000GB
> show collections
yeyz
> 
> db.yeyz.find()
{ "_id" : ObjectId("5fa172c86e2f58da10d28aa3"), "name" : "yeyz" }
> db.yeyz.insert({"name":"zhangsan"})
WriteCommandError({
        "ok" : 0,
        "errmsg" : "not authorized on test to execute command { insert: \"yeyz\", ordered: true, lsid: { id: UUID(\"9d4929be-e7f0-46bf-9fa6-4d37e5a84ad1\") }, $db: \"test\" }",
        "code" : 13,
        "codeName" : "Unauthorized"
})
> exit
bye

可以看到,这个yeyz的账户,仅仅对yeyz这个集合有read的权限,当我们执行insert操作的时候,报错了,认为没有权限。

此时我们切换到root用户,使用grantRolesToUser来给他添加权限:

> db.grantRolesToUser("yeyz",[{role:"readWrite",db:"test"}])

权限角色变为readWrite,这样重新使用账号yeyz进行登录并对yeyz这个集合进行insert操作,发现执行成功,如下:

[root@VM-0-14-centos ~]# mongo -u "yeyz" -p "123456" --authenticationDatabase "test"
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?authSource=test&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("bc2f783f-7807-41cd-82fc-e19cf9a822e7") }
MongoDB server version: 4.0.6
> db
test
> db.yeyz.insert({"name":"zhangsan"})
WriteResult({ "nInserted" : 1 })
> 
> db.yeyz.find()
{ "_id" : ObjectId("5fa172c86e2f58da10d28aa3"), "name" : "yeyz" }
{ "_id" : ObjectId("5fa1743ac69e2dfa962884d7"), "name" : "zhangsan" }

接下来我们演示回收权限的过程:

在上面的yeyz的权限基础上,我们回收yeyz这个账号的readWrite权限,切换到root用户,执行下面的命令:

> use test
switched to db test
> db.revokeRolesFromUser("yeyz",[{role:"readWrite",db:"test"}])
> 

再次使用yeyz这个用户去执行插入操作:

[root@VM-0-14-centos ~]# mongo -u "yeyz" -p "123456" --authenticationDatabase "test"
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?authSource=test&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a09a5449-28f6-4479-9b1a-861b0f8418ac") }
MongoDB server version: 4.0.6
> db.yeyz.insert({"name":"wangwu"})
WriteCommandError({
        "ok" : 0,
        "errmsg" : "not authorized on test to execute command { insert: \"yeyz\", ordered: true, lsid: { id: UUID(\"a09a5449-28f6-4479-9b1a-861b0f8418ac\") }, $db: \"test\" }",
        "code" : 13,
        "codeName" : "Unauthorized"
})
> 

可以发现,插入操作已经报错了,再来看看现在yeyz的权限:

> db.system.users.find().pretty()
{
        "_id" : "admin.root",
        "user" : "root",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
{
        "_id" : "test.yeyz",
        "user" : "yeyz",
        "db" : "test",
        "roles" : [ ],
        "customData" : {
                "desc" : "this is user yeyz"
        }
}

可以发现,yeyz这个用户已经没有任何的权限了,包括读的权限都已经没有了,我们现在试下这个用户还能不能登录:

[root@VM-0-14-centos ~]# mongo -u "yeyz" -p "123456" --authenticationDatabase "test"
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?authSource=test&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("1e968648-44c5-46c1-8dfc-47915b89be28") }
MongoDB server version: 4.0.6
> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
> db
test
> use test
switched to db test
> db.yeyz.find()
Error: error: {
        "ok" : 0,
        "errmsg" : "not authorized on test to execute command { find: \"yeyz\", filter: {}, lsid: { id: UUID(\"1e968648-44c5-46c1-8dfc-47915b89be28\") }, $db: \"test\" }",
        "code" : 13,
        "codeName" : "Unauthorized"
}

可以看到,用户可以登录,但是不能执行任何操作,test下面的show collections操作都不可以了。

这里我们简单总结一下:

1、grantRolesToUser和revokeRolesFromUser这两个方法可以用来给用户分配角色和回收用户的角色。

2、grantRolesToUser将某个角色分配给用户之后,会覆盖用户原来的角色,也就失去了原来的角色权限。

3、revokeRolesFromUser回收用户的角色权限之后,用户的角色会变成空,只有访问权限,没有读写权限。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:DBA随笔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB的2个知识点

    在MySQL中,我们可以通过show processlist的命令来查看当前的连接数,使用max_connections和max_user_connec...

    AsiaYe
  • shell脚本中$符号的意义

    今天是远程办公的第4天,渐渐的找到了一点在家办公的节奏了,改了几个shell脚本,在改动过程中,发现还有一些知识点需要巩固,这里写出来,加深下印象。

    AsiaYe
  • MongoDB运维与开发(四)---用户权限

    上次的文章中我们说到了MongoDB中的用户初始化,而且举了几个小的例子来说明如何进行权限分配,今天我们更加系统的来看这个问题

    AsiaYe
  • Robot Framework | 04 参数化基于Public API的RFS测试

    概述 在上文中,我们基于Robot Framework的public API实现了一个基本的自动化测试实例。 下面我们对上文的代码进行进一步封装,对该测试代码实...

    苦叶子
  • Java Map转对象

    今天遇到一个问题,前端一条数据大概有100多个字段,前端要求按照传参数返回,传了10个就只能返回10个字段的值,所以用对象就不太合适,会返回一些无用字段,所以只...

    赵哥窟
  • 了解针对“所有”版本Android的Cloak & Dagger攻击

    Cloak&Dagger攻击是一种利用权限不匹配问题来访问Android设备的攻击方法,版本在7.1.2及以下的Android设备都会受到这种攻击的影响。Clo...

    FB客服
  • 【MMDetection 超全专栏】二,配置类和注册器&数据处理&训练pipline

    配置方式支持python/json/yaml,从mmcv的Config解析,其功能同maskrcnn-benchmark的yacs类似,将字典的取值方式属性化....

    BBuf
  • 100 行代码写一个手机AR

    Step-1.实现两个协议 1.AVCaptureMetadataOutputObjectsDelegate 2.UINavigationControlle...

    酷走天涯
  • CREATE TABLE ... WITH storage_parameter [= value] [, ... ]

    创建表时,可以通过WITH子句指定storage_parameter,这个存储参数指什么?在代码中如何实现?

    yzsDBA
  • wxpython中设置radiobox相关使用

    黯然销魂掌

扫码关注云+社区

领取腾讯云代金券