//
MongoDB运维与开发(四)
//
上次的文章中我们说到了MongoDB中的用户初始化,而且举了几个小的例子来说明如何进行权限分配,今天我们更加系统的来看这个问题
NO.1
MongoDB用户初始化
如何启用访问控制?
上一节中我们说到,想要启用访问控制,我们有下面的办法:
1、如果用配置文件启动,需要在配置文件中添加auth变量
2、如果使用命令行参数启动,则需要在命令行中添加--auth
这两种方法是针对MongoDB的单实例来说的,如果是MongoDB的集群,则需要在配置文件中设置security.keyFile参数来弃用访问控制,具体配置方法后面到配置复制集的时候再说。
角色与用户的关系是什么?
在MongoDB中,角色与用户的关系如下:
下面对这个图做个解释:
角色(role):
用于绑定具体操作权限与数据库,并授权给用户,使得用户具有访问和操作数据库的权限。
角色分为内建角色和自定义角色,其中内建角色是MongoDB本身自带的角色,每个内建角色都有预设好的权限;自定义角色允许管理者自行定义操作权限的角色。例如find、insert等
用户(user):
角色绑定的对象,表示数据库用户具体登录时候的账号。
例如下面这个语句中:
yeyz就是用户,而userAdminAnyDatabase就是角色。
db.createUser( ... ... { ... ... user: "yeyz", ... ... pwd: "123456", // 或者输入明文密码 ... ... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] ... ... } ... ... )
创建用户的标准语法是什么?
通常使用db.createUser的方法来创建用户。
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()的方法来修改用户的属性,
> 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,如下:
> db.dropUser("yeyz") true
如何查询用户?
查询用户的方法比较简单,类似删除用户一样,一般使用下面的方法:
1、db.getUser(<username>)
2、db.getUsers()
查询用户getUser()函数也有三个参数:
showCredentials:是否显示加密后的密码信息
showPrivileges:是否显示用户全部权限
showAuthencicationRestrictions:是否显示用户的IP地址管控限制
这三个默认都是false,具体的例子我们将在下一节说明。
今天的内容就这么多吧。