//
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,具体的例子我们将在下一节说明。
今天的内容就这么多吧。