MongoDB的使用学习之(四)权限设置--用户名、密码、端口==

摘要:
MongoDB的一个奇怪的设置是,即使是管理员用户也必须在管理员数据库中获得授权,而不是在其他数据库中。首先退出程序,并测试是否需要按照提示输入用户名和密码,以便在重新启动服务后再次连接MongoDB。

本文参照:http://hi.baidu.com/tianhuimin/item/590d96cfd7ac1509c610b26a

本人也是按照此文章操作的,但是有些不妥,红色文字就是我实践后,需要改正的地方

一、关于权限的默认配置

   在默认情况下,mongod是监听在0.0.0.0之上的,任何客户端都可以直接连接27017,且没有认证。这样做的好处是,用户可以即时上手,不用担心被一堆配置弄的心烦意乱。然而坏处也是显而易见,如果直接在公网服务器上如此搭建MongoDB,那么所有人都可以直接访问并修改数据库数据了。

    默认情况下,mongod也是没有管理员账户的。因此除非你在admin数据库中使用db.addUser()命令添加了管理员帐号,且使用–auth参数启动mongod,否则在数据库中任何人都可以无需认证执行所有命令。包括delete和shutdown。

    此外,mongod还会默认监听28017端口,同样是绑定所有ip。这是一个mongod自带的web监控界面。从中可以获取到数据库当前连接、log、状态、运行系统等信息。如果你开启了–rest参数,甚至可以直接通过web界面查询数据,执行mongod命令。

    其实MongoDB本身有非常详细的安全配置准则,显然开发者也是想到了,然而他是将安全的任务推给用户去解决,这本身的策略就是偏向易用性的,对于安全性,则得靠边站了。

    二、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目录;

    1. 输入命令:show dbs,你会发现它内置有两个数据库,一个名为admin,一个名为local;本文只对admin库进行描述

    2. 输入命令:use admin,你会发现该DB下包含了一个名为system.user的collection,这是用户表,用来存放超级管理员的

备注:本文使用的数据库版本是2.0.1,没有默认的admin数据库,但是在执行第二步之后自动创建了一个admin库; 当然也没有默认的system.user表,运行后面的第三步后会自动创建 system.user和system.indexes )

    3. 输入命令:db.addUser('root','root'),这里我添加一个超级管理员用户,username为root,password也为root。先退出 (ctrl+c)程序,测试重启服务后再次连接MongoDB是否需要按提示输入用户名、密码进行操作。

    4. 输入命令:use admin

    5. 输入命令:show collections,查看该库下所有的表,你会发现,MongoDB并没有提示你输入用户名、密码,原因是,在文章最开始提到了,MongoDB默认设置为无权限访问限制,我们需要先把它设置成为需要权限访问

    6.从新打开cmd,在mongodb路径的bin目录下,执行mongod --dbpath  d:workdatamongodbdb  --auth

    7. 输入命令:use admin

    8. 输入命令:show collections,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1"

    显然,已经提示没有权限;用刚才设置的用户名、密码来访问集合

    9. 输入命令:db.auth(“root”,”root”),输出一个结果值为1,说明这个用户匹配上了,如果用户名、密码不对,输出为0

    10. 输入命令:show collections,将成功显示结果

继续操作,可以访问已经存在的数据库,但对于新建的数据库仍然没有权限;继续操作,先退出(ctrl+c)服务

    11. 输入命令:mongo TestDB

    12. 输入命令:show collections,提示:没有权限

    13. 输入命令:db.auth(“root”, “root”),输出结果为0,说明用户名或者密码有问题,刚刚前面才创建,怎么会不对呢?原因在于:当我们单独访问MongoDB的数据库时,需要权限访问的情况下,用户名密码并非超级管理员,而是该库的system.user表中的用户,注意,我这里说的是单独访问的情况,什么是不单独访问的情况呢?后面再讲。针对上述情况,接下来操作:

    14. 输入命令:db.addUser('test','111111'),仍然提示没有权限,新的数据库使用超级管理员也无法访问,创建用户也没有权限,不过即然设定了超级管理员用户,那它就一定有权限访问所有的库

    15. 输入命令:use admin

    16. 输入命令:db.auth(“root”, “root”)

    17. 输入命令:use TestDB

    18. 输入命令:show collections,之后可以利用超级管理员用户访问其它库了,这个就是不单独访问的情况。在上述操作过程中,我们是先进入admin库,再转到其它库来的,admin相当于是一个最高级别用户所在的区域,对数据库操作,需要经过最高级别用户,之后可以创建每个数据库的用户。

    19. 输入命令:db.addUser('test','12345'),我们给TestDB库添加一个用户,以后每次访问该库,我都使用刚刚创建的这个用户,我们先退出(ctrl+c)

    20. 输入命令:mongo TestDB

    21. 输入命令:show collections,提示没有权限

    22. 输入命令:db.auth('test','12345'),输出结果1,用户存在,验证成功

    23. 输入命令:show collections,成功显示结果

四、启动和关闭MongoDB的各种参数

详见:http://blog.csdn.net/pgwindwind/article/details/8005262

比如要改变MongoDB的默认端口,则可以这样使用--port参数:

打开cmd,在mongodb路径的bin目录下,执行mongod --port 50107 --dbpath  d:workdatamongodbdb  --auth

这样访问MongoDB就是以50107的端口访问了

免责声明:文章转载自《MongoDB的使用学习之(四)权限设置--用户名、密码、端口==》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题数据可视化基础专题(44):NUMPY基础(9)数组操作(1)修改数组形状/翻转数组下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用友T3、T6常见问题

1.青岛北苑家具:用友通10.3备份时提示“压缩失败!UFDATA。BAK” 问题解决:清理临时备份文件54599424uftmpufdata.bak后,备份成功。 原因:D盘空间太小。 2.青岛北宛家具:用友通10。3固定资产结转年度数据时提示:列名bbltransdeprt无效。 问题解决:在数据库中的fa_card表增加dbltransdeprt列...

kvm虚拟机磁盘文件读取小结

kvm虚拟机磁盘挂载还真不是一帆风顺的。xen虚拟化默认就raw格式的磁盘,可以直接挂载,kvm如果采用raw也可以直接挂载,与xen磁盘挂载方式一致。 本文出自:http://koumm.blog.51cto.com 1.kvm虚拟化相比xen虚拟化来说,工具与方法众多,本文列举思路如下: (1)raw格式的磁盘可以直接挂载,可以将qcow2磁盘转换成r...

Flask web开发之路七

今天写SQLAlchemy数据库  首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM框架 ORM的好处:可以让我们操作数据库跟操作对象一样,非常方便,因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象;把高层的面向对象操作转换成低层的...

SQL多表联合查询(Access数据库表)

条件:Access数据库的三个表,a表、b表、c表,三个表结构不同,其中都有字段ID,a表为主表,其中的ID不一定b表、c表中都存在,建立此三个表的联合查询。 根据SQL语法,通过连接运算符可以实现多个表查询。连接可以在Select 语句的FROM子句或Where子句中建立,在FROM子句中指出连接时有助于将连接操作与Where子句中的搜索条件区分开来。 ...

tcp_tw_recycle参数引发的数据库连接异常

【问题描述】 开发反馈有个应用在后端数据库某次计划性重启后经常会出现数据库连接异常问题,通过监控系统的埋点数据,发现应用连接数据库异常有两类表现:   其一:连接超时   131148.00ms Tomcat Connection Pool   其二:连接耗时过长   DAL.getConnectionCost 64018ms 【问题分析】 通过监控数据汇...

MariaDB日志文件、备份与恢复

1. 数据库的6种日志        数据库有6种日志,分别是:查询日志、慢查询日志、错误日志、二进制日志、中继日志以及事务日志。 1> 查询日志   查询日志记录每一条sql语句,建议不开启,因为如果访问量较大,会占用相当大的资源,影响性能。 查询日志的开启:        编辑配置文件:/etc/my.cnf.d/server.cnf vim /...