本文整理自网络,侵删。
上一篇博客主要聊了下分布式文档存储数据库之MongoDB备份与恢复,回顾请参考http://1000zx.cn/article/199845.htm;今天我们来了解下mongodb的访问控制;
什么是访问控制?
简单讲访问控制就是指,哪些用户可以访问哪些资源,对资源有哪些操作(权限);在mongodb中我们把数据库、或者集合叫做资源;也就说访问控制是用来限制某些用户对数据库或集合的操作;我们在mysql数据库中,我们通过给账号授权的方式达到控制哪些用户可以从哪些主机访问数据库,对数据库有哪些操作;其中账号由用户名称和主机地址构成;在mongodb中采用的不是用户+主机地址的方式,而是通过给用户赋予一个或多个角色,这个角色或多个角色的所有权限就是这个用户拥有的权限;默认情况mongodb是没有启用访问控制的,所以只要能够连接上mongodb实例,我们就可以在其上做任何操作,在某种程度上,这是一种极为不安全的方式,为了杜绝这种不安全的访问方式,我们需要对mongodb进行访问控制;
mongodb中的角色权限说明
mongodb默认内置了一些角色,不同的角色拥有不同的权限,如下图
查看mongodb中某个数据库所有内置角色
> db.runCommand({rolesInfo:1,showBuiltinRoles:true}) { "roles" : [ { "role" : "dbAdmin", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] }, { "role" : "dbOwner", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] }, { "role" : "enableSharding", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] }, { "role" : "read", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] }, { "role" : "readWrite", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] }, { "role" : "userAdmin", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } ], "ok" : 1 } >
提示:以上是mongodb中test库的默认角色;如果要查看其它库,我们需要切换到其他库,然后运行上述命令查看即可;
查询当前数据中的某个角色
> db test > db.runCommand({rolesInfo:"userAdmin"}) { "roles" : [ { "role" : "userAdmin", "db" : "test", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } ], "ok" : 1 } >
查询其他数据库中指定的角色权限
> db.runCommand({rolesInfo:{role:"userAdmin",db:"config"}}) { "roles" : [ { "role" : "userAdmin", "db" : "config", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } ], "ok" : 1 } > db.runCommand({rolesInfo:{role:"root",db:"config"}}) { "roles" : [ ], "ok" : 1 } > db.runCommand({rolesInfo:{role:"root",db:"admin"}}) { "roles" : [ { "role" : "root", "db" : "admin", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } ], "ok" : 1 } >
创建一个用户名为tom,其角色为超级管理员角色root
> use admin switched to db admin > db.createUser({user:"tom",pwd:"admin123.com",roles:[{"role":"root","db":"admin"}]}) Successfully added user: { "user" : "tom", "roles" : [ { "role" : "root", "db" : "admin" } ] } >
查看当前库用户列表
> db admin > db.getUsers() [ { "_id" : "admin.tom", "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"), "user" : "tom", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ] >
创建数据库管理员用户
> db.createUser({user:"jerry",pwd:"admin123.com",roles:["userAdminAnyDatabase"]}) Successfully added user: { "user" : "jerry", "roles" : [ "userAdminAnyDatabase" ] } > db.getUsers() [ { "_id" : "admin.jerry", "userId" : UUID("5d0b77f2-b7f1-40cd-8149-f08b2e1e6a80"), "user" : "jerry", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }, { "_id" : "admin.tom", "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"), "user" : "tom", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ] >
提示:如果创建用户时,未指定db,则表示当前该用户对当前所在db生效;
删除用户
> db.dropUser("jerry") true > db.getUsers() [ { "_id" : "admin.tom", "userId" : UUID("67bf434a-49fc-4ed5-9e9b-23c443a2fc93"), "user" : "tom", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ] >
提示:删除用户,需切换到对应数据下,指定对应用户名称即可;在mongodb中用户是对应数据库的,一个用户可以对应一个或多个数据库,在指定数据库删除用户,就表示删除指定用户对指定数据库的访问权限;
修改指定用户的密码
> db admin > db.changeUserPassword("tom","123456") >
提示:修改用户密码,第一个是指定用户的名称,第二个是指定新密码;
相关阅读 >>
更多相关阅读请进入《mongodb》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。