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

2020-11-10 11:31:20 浏览数 (1)

//

MongoDB运维与开发(四)

//

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

NO.1

MongoDB用户初始化

如何启用访问控制?

上一节中我们说到,想要启用访问控制,我们有下面的办法:

1、如果用配置文件启动,需要在配置文件中添加auth变量

2、如果使用命令行参数启动,则需要在命令行中添加--auth

这两种方法是针对MongoDB的单实例来说的,如果是MongoDB的集群,则需要在配置文件中设置security.keyFile参数来弃用访问控制,具体配置方法后面到配置复制集的时候再说。

角色与用户的关系是什么?

在MongoDB中,角色与用户的关系如下:

下面对这个图做个解释:

角色(role):

用于绑定具体操作权限与数据库,并授权给用户,使得用户具有访问和操作数据库的权限。

角色分为内建角色和自定义角色,其中内建角色是MongoDB本身自带的角色,每个内建角色都有预设好的权限;自定义角色允许管理者自行定义操作权限的角色。例如find、insert等

用户(user):

角色绑定的对象,表示数据库用户具体登录时候的账号。

例如下面这个语句中:

yeyz就是用户,而userAdminAnyDatabase就是角色。

代码语言:javascript复制
db.createUser(
... ...     {
... ...         user: "yeyz",
... ...         pwd: "123456", // 或者输入明文密码
... ...         roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... ...     }
... ... )

创建用户的标准语法是什么?

通常使用db.createUser的方法来创建用户。

代码语言:javascript复制
db.createUser(
... ...     {
... ...         user: "<name>",
... ...         pwd: "<passwd>", // 或者输入明文密码
... ...         customData:{<any information>},
... ... 
... ...         roles: [ { role: "<role>", db: "<db>" }, "<role>" ]
... ...         authenticationRestriction: [ {
                   clientSource: ["<IP>"]
... ...            serverAddress:["<IP>"] 
... ...         }
... ...     }
... ... )

其中,custonData是用户描述,可以不写。

authenticationRestrictions:此为可选参数,在MongoDB3.6之后提供,用来管控用户进行登录的IP地址,可绑定用户客户端IP地址以及用户访问的NongoDB服务器端IP地址。

如何修改用户的属性?

我们可以使用updateUser()的方法来修改用户的属性,

代码语言:javascript复制
> show users    ### 此时没有用户
> db.createUser(
... {
...    user:"yeyz",
...    pwd:"123456",
...    roles:[{role:"readWrite",db:"test"}]
... }
... )
Successfully added user: {
        "user" : "yeyz",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ]
}
> show users   ###创建用户
{
        "_id" : "test.yeyz",
        "user" : "yeyz",
        "db" : "test",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}
> db.updateUser(
... "yeyz",
... {
... customData:{desc:"this is user yeyz"},
... roles:[
... {role:"read",db:"test"}
... ]
... }
... )
> 
> show users   ### 给用户更新注释,并且将用户权限从readWrite改为read
{
        "_id" : "test.yeyz",
        "user" : "yeyz",
        "db" : "test",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "test"
                }
        ],
        "customData" : {
                "desc" : "this is user yeyz"
        },
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

上面的例子我们给出了修改用户权限的方法:

1、创建用户yeyz

2、修改用户yeyz的权限,从readWrite改为read

3、给用户yeyz添加注释(CustomData)

注意,一般update成功之后,没有返回结果。

如何删除用户?

一般来讲,删除数据库有两种方法,分别是:

db.dropUser():删除指定用户

db.dropAllUser():删除所有的用户

删除操作一般不能将所有账号都删除,需要至少存在一个拥有管理权限的用户,否则无法执行更高权限的操作,如果我们发生了账号的误删除,所有管理者用户都被误删,可以利用下面的方法进行补救:

1、在配置文件中关闭访问参数,也就是我们的auth参数

2、登录MongoDB,创建一个新的管理权限账户

3、配置文件中开启访问参数控制,然后重启MongoDB即可。

删除用户之后,往往有个返回结果,告诉你true或者false,如下:

代码语言:javascript复制
> db.dropUser("yeyz")
true

如何查询用户?

查询用户的方法比较简单,类似删除用户一样,一般使用下面的方法:

1、db.getUser(<username>)

2、db.getUsers()

查询用户getUser()函数也有三个参数:

showCredentials:是否显示加密后的密码信息

showPrivileges:是否显示用户全部权限

showAuthencicationRestrictions:是否显示用户的IP地址管控限制

这三个默认都是false,具体的例子我们将在下一节说明。

今天的内容就这么多吧。

0 人点赞