一、关于权限的默认设置
- 在默认情况下,mongod是监听在
0.0.0.0
之上的,任何客户端都可以直接连接27017
,且没有认证。这样做的好处是,用户可以即时上手,不用担心被一堆配置弄的心烦意乱。坏处则是如果直接在公网服务器上如此搭建MongoDB,那么所有人都可以直接访问并修改数据库数据了。 - 默认情况下,mongod也是没有管理员账户的。因此除非你在admin数据库中使用
db.addUser()
命令添加了管理员帐号,且使用–auth参数启动mongod,否则在数据库中任何人都可以无需认证执行所有命令。包括delete和shutdown。
MongoDB用户类型
- MongoDB的用户分为两种,一种是admin用户,另一种是特定数据库用户。admin用户拥有最高的权限,而特定数据库用户则只能访问特定的数据库。
- 当MongoDB的admin库里没有任何用户的时候,也就是说整个MongoDB没有一个MongoDB用户的时候,即便–auth权限需求打开了,用户还是可以通过localhost界面进入MongoDB进行用户设置,否则的话整个MongoDB就完全没法访问了。而当这个用户创建完成之后,之后的用户登录和操作就需要授权了,不是直接登录就能使用的了。
- MongoDB有一个比较奇怪的设置是,即便是一个admin用户,授权也必须在admin数据库下进行,而不能在其他数据库下进行。而授权之后admin用户就可以在任何数据库下进行任何操作了。当然数据库级别的用户在他自己的数据库下授权之后是不能到其他数据库进行操作的。举例来说:
> use test
> db.auth(“someAdminUser”, password)
//操作失败,提示还没有在admin数据库下对afmin用户进行授权。
三、操作实例
启动MongoDB,在cmd命令框里进入数据库的bin目录;
- 输入命令:
show dbs
,你会发现它内置有两个数据库,一个名为admin,一个名为local; - 输入命令:
use admin
,你会发现该db下包含了一个名为system.user的collection,这是用户表,用来存放超级管理员; - 输入命令:
db.createUser(
... {
... user:"root",
... pwd:"root",
... roles:["userAdminAnyDatabase"]
... }
... )
添加一个超级管理员用户,username为root,password也为root。先退出 (ctrl+c)程序,测试重启服务后再次连接MongoDB是否需要按提示输入用户名、密码进行操作;
- 输入命令:
use admin
- 输入命令:
show collections
,查看该库下所有的表,你会发现,MongoDB并没有提示你输入用户名、密码,原因是MongoDB默认设置为无权限访问限制,我们需要先把它设置成为需要权限访问; - 从新打开cmd,在mongodb路径的bin目录下,执行
./mongod -f mongodb.conf --auth
和./mongo
- 输入命令:
use admin
- 输入命令:
show collections
,提示:"errmsg" : "not authorized on admin to execute command { listCollections: 1.0, filter: {}, $db: "admin" }",
显然,已经提示没有权限;需要用刚才设置的用户名、密码来访问集合 - 输入命令:
db.auth(“root”,”root”)
,输出一个结果值为1,说明这个用户匹配上了,如果用户名、密码不对,输出为0 - 输入命令:
show collections
,将成功显示结果
继续操作,可以访问已经存在的数据库,但对于新建的数据库仍然没有权限;继续操作,先退出(ctrl+c)服务 - 输入命令:
mongo TestDB
- 输入命令:
show collections
,提示:没有权限 - 输入命令:
db.auth(“root”, “root”)
,输出结果为0,说明用户名或者密码有问题,刚刚前面才创建,怎么会不对呢?原因在于:当我们单独访问MongoDB的数据库时,需要权限访问的情况下,用户名密码并非超级管理员,而是该库的system.user表中的用户,注意,我这里说的是单独访问的情况,什么是不单独访问的情况呢?后面再讲。针对上述情况,接下来操作: - 输入命令:
db.addUser('test','111111')
,仍然提示没有权限,新的数据库使用超级管理员也无法访问,创建用户也没有权限,不过即然设定了超级管理员用户,那它就一定有权限访问所有的库 - 输入命令:
use admin
- 输入命令:
db.auth(“root”, “root”)
- 输入命令:
use TestDB
- 输入命令:
show collections
,之后可以利用超级管理员用户访问其它库了,这个就是不单独访问的情况。在上述操作过程中,我们是先进入admin库,再转到其它库来的,admin相当于是一个最高级别用户所在的区域,对数据库操作,需要经过最高级别用户,之后可以创建每个数据库的用户。 - 输入命令:
db.addUser('test','12345')
,我们给TestDB库添加一个用户,以后每次访问该库,我都使用刚刚创建的这个用户,我们先退出(ctrl+c) - 输入命令:
mongo TestDB
- 输入命令:
show collections
,提示没有权限 - 输入命令:
db.auth('test','12345')
,输出结果1,用户存在,验证成功 - 输入命令:
show collections
,成功显示结果
可能需要用到的操作
- 查看关于mongo的线程
ps -ef | grep mongo
//查询结果示例
lujiafengdeMBP:~ lujiafeng$ ps -ef | grep mongo
501 2575 1 0 5:04下午 ?? 0:01.51 ./mongod -f mongodb.conf
501 2583 1247 0 5:05下午 ttys000 0:00.11 ./mongo
501 2585 2463 0 5:05下午 ttys001 0:00.00 grep mongo
- 杀死线程
kill 1247