MongoDB设置访问权限、设置用户
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下:
注:研究成果基于Windows平台
MongoDB在本机安装部署好后
1. 输入命令:show dbs,你会发现它内置有两个数据库,一个名为admin,一个名为local。local好像没啥用,如果哪位在使用过程中发现了这个local表的用途,希望能够留言提醒,那我们就专心来说说admin表
2. 输入命令:use admin,你会发现该DB下包含了一个system.user表,呵呵,没错,这个表就等同于MsSql中的用户表,用来存放超级管理员的,那我们就往它里面添加一个超级管理员试试看
3. 输入命令:db.addUser('sa','sa'),这里我添加一个超级管理员用户,username为sa,password也为sa,即然我们添加了超级管理员,那咱们就来测试下,看看咱们再次连接MongoDB需不需要提示输入用户名、密码,我们先退出来(ctrl+c)
4. 输入命令:use admin
5. 输入命令:show collections,查看该库下所有的表,你会发现,MongoDB并没有提示你输入用户名、密码,那就奇怪了,这是怎么回事呢?在文章最开始提到了,
MongoDB默认设置为无权限访问限制,即然这样,那我们就先把它设置成为需要权限访问限制,咱们再看看效果,怎么设置呢?
6. 在注册表中,找到MongoDB的节点,在它的ImgPath中,我们修改一下,加入 -auth,如下所示:
"D:\Program Files\mongodb\bin\mongod" -dbpath e:\work\data\mongodb\db -logpath e:\work\data\mongodb\log -auth -service
7. 输入命令:use admin
8. 输入命令:show collections,呵呵,我们发现无法查看该库下的表了,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",很明显,提示没有权限,看来关键就在于这里,我们在启动MongoDB时,需要加上-auth参数,这样我们设置的权限才能生效,好,接下来我们使用刚刚之前设置的用户名、密码来访问
9. 输入命令:db.auth('sa','sa'),输出一个结果值为1,说明这个用户匹配上了,如果用户名、密码不对,会输入0
10. 输入命令:show collections,呵呵,结果出来了,到这里,权限设置还只讲到一多半,接着往下讲,我们先退出来(ctrl+c)
11. 输入命令:mongo TestDB,我们尝试连接一个新的库(无论这个库是否存在,如果不存在,往该库中添加数据,会默认创建该库),然后,我们想看看该库中的表
12. 输入命令:show collections,好家伙,没权限,我们输入上面创建的用户名、密码
13. 输入命令:db.auth('sa','sa'),输入结果0,用户不存在,这下有人可能就不明白了,刚刚前面才创建,怎么会不存在呢?原因在于:当我们单独访问MongoDB的数据库时,需要权限访问的情况下,用户名密码并非超级管理员,而是该库的system.user表中的用户,注意,我这里说的是单独访问的情况,什么是不单独访问的情况呢?接下来再讲,现在咋办,没权限,那我们就尝试给库的system.user表中添加用户
14. 输入命令:db.addUser('test','111111'),哇靠,仍然提示没有权限,这可咋办,新的数据库使用超级管理员也无法访问,创建用户也没有权限,呵呵,别急,即然设定了超级管理员用户,那它就一定有权限访问所有的库
15. 输入命令:use admin
16. 输入命令:db.auth('sa','sa')
17. 输入命令:use TestDB
18. 输入命令:show collections,哈哈,一路畅通无阻,我们发现可以利用超级管理员用户访问其它库了,呵呵,这个就是不单独访问的情况,不难发现,我们是先进入admin库,再转到其它库来的,admin相当于是一个最高级别官员所在区域,如果你是个地产商,想在地方弄个大工程做做,你想不经过那些高级官员就做,这是行不通的,你需要先去到他们那里,送点礼,再顺着下到地方,工程你就可以拿到手了,此言论仅为个人观点,不代表博客园;即然工程拿到手了,就要开始建了,那我们不至于每加块砖、添个瓦都得去和那帮高级官员打招呼吧,所以我们得让这个工程合法化,咱们得把相关的手续和证件弄齐全,不至于是违建
19. 输入命令:db.addUser('test','111111'),我们给TestDB库添加一个用户,以后每次访问该库,我都使用刚刚创建的这个用户,我们先退出(ctrl+c)
20. 输入命令:mongo TestDB
21. 输入命令:show collections,提示没有权限
22. 输入命令:db.auth('test','111111'),输出结果1,用户存在,验证成功
23. 输入命令:show collections,没再提示我没有权限,恭喜您,成功了
好累啊!一口气写完,呵呵
注:当需要使用权限才能访问MongoDB时,如果需要查看MongoDB中所有的库,我们只能通过超级管理员权限,输入命令show dbs来查看了。
版权声明:本文为博主原创文章,未经博主允许不得转载!!
1、导言
折腾mongodb几个小时终于有结果了。呃!现在就简单总结一下。
其实我的需求很简单,就是在C++代码中调用mongodb的库函数,也就是要得到mongoclient.lib。本来想直接下载个,可在网上也没找到,觉得重新编译也不麻烦,于是就下了源码编译。可下错了源码,编了半天也编不出来,晕!
其实就是参考了网友们的文章,在这里下载了源码mongodb-src-r2.6.3.zip。编译命令也很简单,大家都说直接输入:scons mongoclient.lib即可,可不断弹出这样的错误:
scons: *** Do not know how to make File target `mongoclient.lib' (C:\mongo-maste
r\mongoclient.lib). Stop.
结果不知道怎么发现mongoclient.lib在新版本中不再是target了,已经移到了另一个源码mongo-cxx-driver-legacy.zip中了,地址在这里。不过,在mongo-src中,像mongo,mongod还是直接可以编译成功的,貌似不需要boost库
2、准备工作
2.1 下载安装mongo-win32.msi
为了节约时间,我就直接下载了相关exe文件像mogo.exe,mogod.exe
2.2 依次安装Python,scons,boost
详细信息可参考我给出的链接地址。我就强调一些我发现的:
2.2.1 有人说mongoclient只链接boost静态库,我发现不是这样,当指定--dynamic-windows,--sharedclient参数后,需要给出boost动态lib库目录,而非*-s.lib
2.2.2 当未指定指定--dynamic-windows,--sharedclient参数时,貌似不用给出boost库目录,我也不太确定,反正我是没给出像libboost_date_time-vc110-mt-s-1_53.lib等文件的路径
3、编译mongoclient
从vs2012命令行中进入mongo-cxx-driver-legacy目录,执行:
scons install-mongoclient --cpppath=boost头文件路径
结果在build\install\lib直接生成libmongoclient-s.lib,128M
当然也可添入--dynamic-windows,--sharedclient,--dbg等参数,可生成对应的动态库,包括调试版和发行版。详细说明可看这里。结果我的目录里有以下文件:
说实话,我是真没搞清楚这些文件的区别,我已经凌乱了……
4、测试
我不得不说,这一步也走得真悬,竟有两个重要步骤被我猜准了。。
本来代码很简单,就连接上mongod.exe进程开启的服务器就行,也不知道怎么回事,网友们都没有我说得那两个步骤,莫非是新版本更新的问题,抑或我忽视了一些东西?
代码如下:
- #include <iostream>
- #include <cstdlib>
- #include <winsock2.h>
- #include "mongo\client\dbclient.h"
- using namespace std;
- void run()
- {
- mongo::DBClientConnection con;
- con.connect("127.0.0.1:27017");
- }
- int main()
- {
- WSAData wsaData;
- if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0)
- {
- return -1;
- }
- try
- {
- run();
- cout << "conn ok" << endl;
- }
- catch (const mongo::DBException &e)
- {
- cout << "caught " << e.what() << endl;
- }
- getchar();
- return EXIT_SUCCESS;
- }
下面就说我的两个重大修改,只是相比于网友们的文件:
1、在dbclient.h头文件之前添加winsock2.h,因为在vs2012中如果不加会报错:"You must include the windows and windows sockets headers before dbclient.h"
2、在main函数开头,我添加了WSAStartup的5行代码,因为如果不添加,在某一个文件中的getAddr调用会异常:"WSAStartup() failed"
不能说常规代码错了,只能说由于各种原因,在这种情况下需要这么做才会编译运行正常。
运行就简单了,首先启动mogod -dbpath d:\data,默认端口在27017,然后启动上面的客户端,输出conn ok。Done !
5、参考网址