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

2020-11-10 11:33:21 浏览数 (1)

//

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

//

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

MongoDB授权与回收权限

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

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

1、db.grantRolesToUser()

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

代码语言:javascript复制
db.grantRolesToUser("<username>",[<roles>],{<writeConcern>})

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

2、db.revokeRolesFromUser()

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

代码语言:javascript复制
db.revokeRolesFromUser("<username>",[<roles>],{<writeConcern>})

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

代码语言:javascript复制
> 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权限。我们来验证一下这个权限:

代码语言:javascript复制
[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来给他添加权限:

代码语言:javascript复制
> db.grantRolesToUser("yeyz",[{role:"readWrite",db:"test"}])

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

代码语言:javascript复制
[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用户,执行下面的命令:

代码语言:javascript复制
> use test
switched to db test
> db.revokeRolesFromUser("yeyz",[{role:"readWrite",db:"test"}])
> 

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

代码语言:javascript复制
[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的权限:

代码语言:javascript复制
> 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这个用户已经没有任何的权限了,包括读的权限都已经没有了,我们现在试下这个用户还能不能登录:

代码语言:javascript复制
[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回收用户的角色权限之后,用户的角色会变成空,只有访问权限,没有读写权限。

0 人点赞