溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MongoDB的賬戶與權限管理及在Python與Java中的登錄

發布時間:2020-07-14 01:39:34 來源:網絡 閱讀:447 作者:張濤澤 欄目:數據庫

本文主要介紹了MongoDB的賬戶新建,權限管理(簡單的),以及在Python,Java和默認客戶端中的登陸。

默認的MongoDB是沒有賬戶權限管理的,也就是說,不需要密碼即可登陸,即可擁有讀寫的權限(當然,重啟服務還是需要在本機執行)。
這個對于自己做實驗室足夠使用的,但是對于開放數據給他人使用時很不安全的,倒不是怕竊取數據,主要是怕某些豬隊友一下把db給drop了,如果沒有容災備份哭都來不及。
對于MongoDB的權限配置,我看著官方文檔和別人的筆記也算是踩過坑的人了,把踩過的坑寫出來給大家看一下,減少別人踩坑的次數。主要踩的坑還是集中在不同的語言的登陸上,這一方面資料比較少。

首先切換到admin數據庫
 use admin 
然后創建一個超級用戶,其中user和pwd的值可以自己隨便定義。

MongoDB的賬戶與權限管理及在Python與Java中的登錄

1 db.createUser(2   {3     user: "super_user",4     pwd: "super_user_paasswd",5     roles: [ { role: "__system", db: "admin" } ]6   }7 )

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 

隨后我們新建兩個用戶,一個具有讀寫權限,一個只有讀取的權限。
讀寫權限的賬號給所有需要寫數據的服務和程序使用,讀取的賬號給同事查看和聚集數據的時候使用。

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 1 //新建讀賬號 2 db.createUser( { 
 3     "user" : "rouser",//賬號名稱 4     "pwd": "rouserpwd",//密碼 5     "customData" : { 6         //注釋 7         user_abs:"read-only user for data analysis" 
 8     }, 9     "roles" : [ 
10         {11             role: "readAnyDatabase",//讀所有數據庫12             db: "admin"13         } 
14     ]15     },{ 
16         w: "majority" , 
17         wtimeout: 5000 
18     } 
19 )20 //新建讀寫賬號21 db.createUser( { 
22     "user" : "rwuser",//賬號名稱23     "pwd": "rwuser_pwd",//密碼24     "customData" : { //注釋25         user_abs:"read-write user for data extractor" 
26     },27     "roles" : [ 
28         {29             role: "readWriteAnyDatabase",//讀寫所有數據庫30             db: "admin"31         } 
32     ]33     },{ 
34         w: "majority" , 
35         wtimeout: 5000 
36     } 
37 )

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 

創建完成以后,首先檢查一下是不是新建好了,簡單的說,就是看一下admin里面是不是記錄了你要的用戶賬戶:

MongoDB的賬戶與權限管理及在Python與Java中的登錄

1 db.getCollection("system.users").find({})2 3 //輸出:4 //實際輸入:db.getCollection("system.users").find({},{"credentials":0})5 { "_id" : "admin.super_user", "user" : "super_user", "db" : "admin", "roles" : [ { "role" : "__system", "db" : "admin" } ] }6 { "_id" : "admin.rouser", "user" : "rouser", "db" : "admin", "customData" : { "user_abs" : "read-only user for data analysis" }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }7 { "_id" : "admin.rwuser", "user" : "rwuser", "db" : "admin", "customData" : { "user_abs" : "read-write user for data extractor" }, "roles" : [ { "role" : "readWriteAnyDatabase", "db" : "admin" } ] }

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 

看到輸出了所有的賬戶信息,就OK了,下一步就是重新啟動服務,在重啟服務之前,需要在config文件中設置`auth = true`,這樣才會需要登錄,否則什么都沒變
以下是我的Config文件,最后一行是重新安裝服務的Command,如果沒有安裝過,使用--install參數即可:

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 1 #存放數據目錄 2 dbpath=F:\FeaturesData\data 3 #日志文件 4 logpath=F:\FeaturesData\mongo.log 5 #Cache Size 6 wiredTigerCacheSizeGB=1 7  8 auth = true 9 logappend = true10 directoryperdb = true11 12 #執行13 # mongod --config "F:\FeaturesData\mongo.config" --serviceName "MongoDB" --reinstall

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 

這樣啟動以后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登陸:

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 1 try:# Python 3.x 2     from urllib.parse import quote_plus 3 except ImportError:# Python 2.x 4     from urllib import quote_plus 5 from pymongo import MongoClient 6  7 #Example 8 user = 'USER' 9 password = 'PASSWORD'10 host = '127.0.0.1:27017'11 #Code12 uri = "mongodb://%s:%s@%s" % (13     quote_plus(user), quote_plus(password), host)14 client = MongoClient(uri)

MongoDB的賬戶與權限管理及在Python與Java中的登錄

再考慮使用Java登陸(稍微麻煩一點):

MongoDB的賬戶與權限管理及在Python與Java中的登錄

 1 //這個是我自己封裝的讀取Properties文件的類 2 import com.zjtj.yuanyifan.Util.PropertiesUtil; 3  4 import com.mongodb.BasicDBObject; 5 import com.mongodb.MongoClient; 6 import com.mongodb.MongoCredential; 7 import com.mongodb.ServerAddress; 8 import com.mongodb.client.FindIterable; 9 import com.mongodb.client.MongoCollection;10 11 private MongoCollection<Document> getMongoDBConnection() {12         //初始化Mongodb數據庫連接,變量名我想不需要解釋了13         PropertiesUtil pu = new PropertiesUtil();14         String vfdbname = pu.getPropString("vehicle_features_db_name", "vf");15         String vfdbip = pu.getPropString("vehicle_features_db_ip", "127.0.0.1");16         String vfdbport = pu.getPropString("vehicle_features_db_port", "27017");17         String vfdbuser = pu.getPropString("vehicle_features_db_user", "USER_HERE");18         String vfdbpwd  = pu.getPropString("vehicle_features_db_pwd", "PASSWD_HERE");19         try {20             21             ServerAddress sainfo = new ServerAddress(vfdbip, Integer.valueOf(vfdbport));22             List<MongoCredential> mgauth = new ArrayList<>();23             mgauth.add(MongoCredential.createCredential(vfdbuser,"admin",vfdbpwd.toCharArray()));24             MongoCollection<Document> mgdbc = new MongoClient(sainfo,mgauth).getDatabase(vfdbname).getCollection("daily_features");25             String dbgInfo = String.format("Connected to mongodb://%s:%s/%s/\n", vfdbip, vfdbport, vfdbname);26             System.out.printf(dbgInfo);27             fcc_log.info(dbgInfo);28             return mgdbc;29         } catch (Exception ex) {30             String errInfo = "Error while initializing MongoDB connection: " + ex.getMessage();31             System.err.println(errInfo);32             fcc_log.fatal(errInfo);33         }34     }

MongoDB的賬戶與權限管理及在Python與Java中的登錄


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女