设为首页 收藏本站
查看: 1077|回复: 0

[经验分享] MongoDB的账户与权限管理及在Python与Java中的登录

[复制链接]

尚未签到

发表于 2017-12-16 08:58:01 | 显示全部楼层 |阅读模式
  本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆。
  默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权限(当然,重启服务还是需要在本机执行)。
  这个对于自己做实验室足够使用的,但是对于开放数据给他人使用时很不安全的,倒不是怕窃取数据,主要是怕某些猪队友一下把db给drop了,如果没有容灾备份哭都来不及。
  对于MongoDB的权限配置,我看着官方文档和别人的笔记也算是踩过坑的人了,把踩过的坑写出来给大家看一下,减少别人踩坑的次数。主要踩的坑还是集中在不同的语言的登陆上,这一方面资料比较少。
  首先切换到admin数据库
  use admin
  然后创建一个超级用户,其中user和pwd的值可以自己随便定义。
  

db.createUser(  

   {  

     user: "super_user",  

     pwd: "super_user_paasswd",  

     roles: [ { role: "__system", db: "admin" } ]  

   }  

)  

  随后我们新建两个用户,一个具有读写权限,一个只有读取的权限。
  读写权限的账号给所有需要写数据的服务和程序使用,读取的账号给同事查看和聚集数据的时候使用。
  

//新建读账号  
db.createUser( {
  
     "user" : "rouser",//账号名称
  
     "pwd": "rouserpwd",//密码
  
     "customData" : {
  
         //注释
  
         user_abs:"read-only user for data analysis"
  
     },
  
     "roles" : [
  
         {
  
             role: "readAnyDatabase",//读所有数据库
  
             db: "admin"
  
         }
  
     ]
  
     },{
  
         w: "majority" ,
  
         wtimeout: 5000
  
     }
  
)
  
//新建读写账号
  
db.createUser( {
  
     "user" : "rwuser",//账号名称
  
     "pwd": "rwuser_pwd",//密码
  
     "customData" : { //注释
  
         user_abs:"read-write user for data extractor"
  
     },
  
     "roles" : [
  
         {
  
             role: "readWriteAnyDatabase",//读写所有数据库
  
             db: "admin"
  
         }
  
     ]
  
     },{
  
         w: "majority" ,
  
         wtimeout: 5000
  
     }
  
)
  

  创建完成以后,首先检查一下是不是新建好了,简单的说,就是看一下admin里面是不是记录了你要的用户账户:
  

db.getCollection("system.users").find({})  

  
//输出:
  
//实际输入:db.getCollection("system.users").find({},{"credentials":0})
  
{ "_id" : "admin.super_user", "user" : "super_user", "db" : "admin", "roles" : [ { "role" : "__system", "db" : "admin" } ] }
  
{ "_id" : "admin.rouser", "user" : "rouser", "db" : "admin", "customData" : { "user_abs" : "read-only user for data analysis" }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }
  
{ "_id" : "admin.rwuser", "user" : "rwuser", "db" : "admin", "customData" : { "user_abs" : "read-write user for data extractor" }, "roles" : [ { "role" : "readWriteAnyDatabase", "db" : "admin" } ] }
  

  看到输出了所有的账户信息,就OK了,下一步就是重新启动服务,在重启服务之前,需要在config文件中设置`auth = true`,这样才会需要登录,否则什么都没变
  以下是我的Config文件,最后一行是重新安装服务的Command,如果没有安装过,使用--install参数即可:
  

#存放数据目录  

dbpath=F:\FeaturesData\data  

#日志文件  

logpath=F:\FeaturesData\mongo.log  

#Cache>
wiredTigerCacheSizeGB=1  

  
auth = true
  
logappend = true
  
directoryperdb = true
  

  
#执行
  
# mongod --config "F:\FeaturesData\mongo.config" --serviceName "MongoDB" --reinstall
  

  这样启动以后Mongo就有权限了,这个时候的登陆要使用账号密码:
  mongo" -u super_user -p super_user_paasswd --authenticationDatabase admin 127.0.0.1/test
  其中127.0.0.1/test是IP/数据库名称以连接默认数据库。
  这个时候你可以试一下使用只读账号删库或者删集合,会出现drop failed: MongoError: not authorized on test to execute command
  意味着你没有权限删除,这个时候不要说删除,插入操作也是不能做的。
  除了使用默认的客户端连接,我们还可以使用其它语言的Driver去连接。
  这里考虑使用Python和Java两种情况
  首先考虑在Python中的连接,我们使用URI登陆:
  

try:# Python 3.x  
     from urllib.parse import quote_plus
  
except ImportError:# Python 2.x
  
     from urllib import quote_plus
  
from pymongo import MongoClient
  

  
#Example
  
user = 'USER'
  
password = 'PASSWORD'
  
host = '127.0.0.1:27017'
  
#Code
  
uri = "mongodb://%s:%s@%s" % (
  
     quote_plus(user), quote_plus(password), host)
  
client = MongoClient(uri)
  

  再考虑使用Java登陆(稍微麻烦一点):
  

//这个是我自己封装的读取Properties文件的类  
import com.zjtj.yuanyifan.Util.PropertiesUtil;
  

  
import com.mongodb.BasicDBObject;
  
import com.mongodb.MongoClient;
  
import com.mongodb.MongoCredential;
  
import com.mongodb.ServerAddress;
  
import com.mongodb.client.FindIterable;
  
import com.mongodb.client.MongoCollection;
  

  
private MongoCollection<Document> getMongoDBConnection() {
  
         //初始化Mongodb数据库连接,变量名我想不需要解释了
  
         PropertiesUtil pu = new PropertiesUtil();
  
         String vfdbname = pu.getPropString("vehicle_features_db_name", "vf");
  
         String vfdbip = pu.getPropString("vehicle_features_db_ip", "127.0.0.1");
  
         String vfdbport = pu.getPropString("vehicle_features_db_port", "27017");
  
         String vfdbuser = pu.getPropString("vehicle_features_db_user", "USER_HERE");
  
         String vfdbpwd  = pu.getPropString("vehicle_features_db_pwd", "PASSWD_HERE");
  
         try {
  
            
  
             ServerAddress sainfo = new ServerAddress(vfdbip, Integer.valueOf(vfdbport));
  
             List<MongoCredential> mgauth = new ArrayList<>();
  
             mgauth.add(MongoCredential.createCredential(vfdbuser,"admin",vfdbpwd.toCharArray()));
  
             MongoCollection<Document> mgdbc = new MongoClient(sainfo,mgauth).getDatabase(vfdbname).getCollection("daily_features");
  
             String dbgInfo = String.format("Connected to mongodb://%s:%s/%s/\n", vfdbip, vfdbport, vfdbname);
  
             System.out.printf(dbgInfo);
  
             fcc_log.info(dbgInfo);
  
             return mgdbc;
  
         } catch (Exception ex) {
  
             String errInfo = "Error while initializing MongoDB connection: " + ex.getMessage();
  
             System.err.println(errInfo);
  
             fcc_log.fatal(errInfo);
  
         }
  
     }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424611-1-1.html 上篇帖子: MongoDb在windows下的安装与以auth方式启用服务 下篇帖子: [Mongodb] 借mongodb被入侵勒索事件,谈下Linux服务器端口安全问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表