今天主要说下我为了给mongodb数据库添加authorization,大家应该知道,mongo默认是无auth运行的。这可能是方便小伙伴学习命令吧。

由于之前发布的一个项目,在亚马逊的云上,处于内部应用,也没有给数据库添加auth,没有想到,被AWS的监控发现了,提示需要安全措施,不能无auth运行,因为这样子会被外部网络查询攻击。所以今天要将那个应用重新修改一下mongo客户端程序的应用方式。程序是python写的,改起来还是比较方便,不像java还要再编译打包发布,python程序,现场修改即可应用!

这里,说说python调用mongodb的需要auth的API过程,常见的有两种方式:

方式1:

 db_conf = config.mongo
db = MongoClient(host=db_conf["ip_addr"], port=db_conf["port"])[db_conf["db_name"]]
db.authenticate(db_conf["user_name"], db_conf["password"])   #当不需要auth的时候,这行代码可以不需要

方式2:

uri = "mongodb://"+conf['mongodb_username']+":"+conf['mongodb_password']+"@"+conf['mongodb_host']+":"+str(conf['mongodb_port'])+"/"+conf['mongodb_db_name']
db = pymongo.MongoClient(uri)[conf['mongodb_db_name']]

看上去是不是很简单,按照API的需要填写参数即可。

我的应用发布在两个云主机上,不幸的是,两个主机上的mongodb版本不一样,悲惨的我,之前不知道有这等大的不同,关于auth的屁大点的事情。一个是2.4.1,一个是2.6.6. 他们之间的差别主要是认证用户信息存放的位置和管理机制不同。我的应用程序的数据库名字是BlastdDB。

2.4.1的认证用户信息是存放在对应的database里面的system.users表里面,而admin表里面是没有内容的,悲惨的是,仅仅在BlastdDB里面添加用户是不行的,因为这个时候,你会发现,即使mongod这个server程序启动时带上--auth,你再用mongo去访问,他还是照样什么都可以操作,什么都可以看。。。撕逼的设计啊。。。

 root@ec2----:/opt/mongodb/bin# ./mongo      #这个是admin表为空的情况下,但是mongod启动是带上了--auth操作,BlastdDB此时也有添加认证用户
MongoDB shell version: 2.4.
connecting to: test
> show collections
system.indexes
test
> use BlastdDB
switched to db BlastdDB
> show collections
system.indexes
system.users
target_service
user
worker

下面再看看,我将admin数据库中添加一个认证用户,并操作一下其他的数据库,看看日志,就清楚了:

 > use admin
switched to db admin
> db.addUser("admin", "admin")
{
"user" : "admin",
"readOnly" : false,
"pwd" : "7c67ef13bbd4cae106d959320af3f704",
"_id" : ObjectId("569da568a93f15901119708a")
}
>
> use BlastdDB
switched to db BlastdDB
> show collections
Tue Jan ::50.239 JavaScript execution failed: error: {
"$err" : "not authorized for query on BlastdDB.system.namespaces",
"code" :
} at src/mongo/shell/query.js:L128
> use test
switched to db test
> show collections
Tue Jan ::07.620 JavaScript execution failed: error: {
"$err" : "not authorized for query on test.system.namespaces",
"code" :
} at src/mongo/shell/query.js:L128
> use BlastdDB
switched to db BlastdDB
> show collections
Tue Jan ::48.129 JavaScript execution failed: error: {
"$err" : "not authorized for query on BlastdDB.system.namespaces",
"code" :
} at src/mongo/shell/query.js:L128
> db.auth("xxxx", "yyyy") > show collections
system.indexes
system.users
target_service
user
worker

但是,对于2.6.6这个版本,就不同了,对于我的数据库BlastdDB添加认证用户信息,其实,这些信息不在BlastdDB的system.users表中,而是在admin的system.users表中,所以,当启动mongod的时候,若带上--auth,则,登录BlastdDB,会要求正确的用户名和密码信息,否则报错。和2.4.1的区别,主要是少了一步必须给admin数据库添加认证用户(对于2.4.1,这个认证用户信息不必和应用数据库的认证信息相同,只要有一个就可以)。另外,就是认证用户信息的存放位置不同,对于2.6.6是集中存放在admin当中了。当然,admin中也可以创建认证用户,这个用户可以查看所有的数据库的信息了,属于超级用户。下面看看我的操作日志,反映一下两个版本的差别:

 root@ec2-xxx-xxx-xxx-xxx:/usr/local/mongodb-linux-x86_64-2.6./bin# ./mongo    #这个是去访问已经带有--auth选项的mongod服务程序
MongoDB shell version: 2.6.
connecting to: test
> use admin
switched to db admin
> show collections
--19T03::51.958+ error: {
"$err" : "not authorized for query on admin.system.namespaces",
"code" :
} at src/mongo/shell/query.js:
> show dbs
--19T03::58.754+ listDatabases failed:{
"ok" : ,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" :
} at src/mongo/shell/mongo.js:
> use BlastdDB
switched to db BlastdDB
> db.auth("xxxx", "yyyy") > show collections
cloud_provider
counters
system.indexes
user

下面这个日志,可以反映出另外一些信息,比如创建认证用户的输出在两个版本中是不同的,最重要的是看collection中的数据结构的不同,可以反映出认证用户的管理方式的变化,这个变化可以说明新的版本管理理念要比旧版本先进:

2.4.1:

 >use admin
> db.auth("admin","admin") > show collections
system.indexes
system.users
> db.system.users.find()
{ "_id" : ObjectId("569da568a93f15901119708a"), "user" : "admin", "readOnly" : false, "pwd" : "7c67ef13bbd4cae106d959320af3f704"

2.6.6:

 MongoDB shell version: 2.6.
connecting to: test
> use admin
switched to db admin
> show collections
system.indexes
system.users
system.version
> db.system.users.find()
{ "_id" : "BlastdDB.scrc", "user" : "scrc", "db" : "BlastdDB", "credentials" : { "MONGODB-CR" : "53ba09afcf99336d2af2a5d020e5d51e" }, "roles" : [ { "role" : "dbOwner", "db" : "BlastdDB" } ] }
> use admin
switched to db admin
> db.addUser("admin", "admin")
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
> db.system.users.find()
{ "_id" : "BlastdDB.scrc", "user" : "scrc", "db" : "BlastdDB", "credentials" : { "MONGODB-CR" : "53ba09afcf99336d2af2a5d020e5d51e" }, "roles" : [ { "role" : "dbOwner", "db" : "BlastdDB" } ] }
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "MONGODB-CR" : "7c67ef13bbd4cae106d959320af3f704" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
>

这些变化,方便用户关注,后续应用中遇到了,可以作为借鉴,不要因为版本的差异导致迷途而浪费了时间。

mongodb不同版本之间有很大的差异的更多相关文章

  1. jqGrid标题行与第一行之间有很大空白的问题解决。

    如题的问题,网上找了很久,都没有解决方案.最后发现,问题不在jqgrid的配置代码,问题在前台HTML代码. <table id="grid" height="30 ...

  2. Odoo 的库存管理与OpenERP之前的版本有了很大的不同,解读Odoo新的WMS模块中的新特性

    原文来自:http://shine-it.net/index.php/topic,16409.0.html 库存移动(Stock Move)新玩法Odoo的库存移动不仅仅是存货在两个“存货地点”之间的 ...

  3. Android版本之间的区别

    不同版本SDK适配要点 1,指定minSDKVersion与targetSDKVersion 2,运行时获取版本号 3,使用系统内置的主题,会随着版本的更换而自动适配 4,用android提供的注解 ...

  4. CLR/.NET/C#/Visual Studio/ASP.NET各版本之间的关系(转)

    由于这篇文章记录的是2015年7月,那时.net core还是叫做.net core 5 名词定义 下列这些名词,写.NET 的人一定都不陌生,但你是否有真正理解呢?如果看了我的摘要文字说明还无法理解 ...

  5. [51CTO]给您介绍Windows10各大版本之间区别

    给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...

  6. Atitit mac os 版本 新特性 attilax大总结

    Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0)  1984年2 2.2. Mac OS 7. ...

  7. mysql5.6启动占用内存很大的解决方法

    vps的内存为512M,安装好nginx,php等启动起来,mysql死活启动不起来看了日志只看到对应pid被结束了,后跟踪看发现是内存不足被killed; 调整my.cnf 参数,重新配置(系统默认 ...

  8. .net Framework各个版本之间的发展

    原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还 ...

  9. .net FrameWork各个版本之间的发展[转]

    上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET  FrameWork,身为一个NET程序员,里面大概的区别自己还是知道的,但是自己要说出个所以然来了,发现还是有点力不 ...

随机推荐

  1. alpha阶段总结 说明

    其实alpha阶段总结那个博客,我们团队已经做过了,只是那个博客的名字不叫alpha阶段总结,是叫第一个sprint与第二个sprint阶段总结.里面详细包含了我们的alpha版本的介绍,与那时的团队 ...

  2. 了解 C++ 默默编写并调用的函数

    前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ ...

  3. 触摸精灵lua脚本实现微信群加好友功能

    --此脚本针对iPhone5/5s --目前只实现一个屏幕微信群好友的添加,如果想添加更多好友, --需要划屏操作,执行划屏操作时建议循环滑动 function main() --获取屏幕的分辨率 w ...

  4. hdu4632 Palindrome subsequence ——区间动态规划

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4632 refer to: o(╯□╰)o……明明百度找的题解,然后后来就找不到我看的那份了,这位哥们对 ...

  5. eBay_Relist(退换刊登费)

    如果物品首次刊登结束时没有人中标,或是买家并没有付款完成交易,那么卖家以通过重新刊登的方法来再次销售.如果该物品在第二次刊登时成功售出,且满足eBay的重新刊登退费条件,那么eBay便会退还重新刊登的 ...

  6. ubuntu14.04 and ros indigo install kinect driver--16

    摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 今日多次测设ros indigo install kinect driver ,提示各种失败,然 ...

  7. Python 简单爬虫

    import os import time import webbrowser as web import random count = random.randint(20,40) j = 0 whi ...

  8. Unity3d纹理压缩格式表

  9. 如何在远程计算机上运行PowerShell

    问题: 不能在WORKGROUP里面的远程计算机里运行PowerShell指令,报错为用户名密码错 解决方法: 把两台机器上(远程计算机其和本机)都加入到trustedhosts 具体请参考 http ...

  10. kuangbin_ShortPath L (POJ 2502)

    dij部分还是跟模板差不多的 但是这题的难点是处理输入 或者说理解题意 事实上每个点之间都是可以走的......WA了好几发就因为没意识到同一条路线上的各个站点之间居然也可以走得比车子快.... PS ...