mongodb設置用戶密碼

場景:某項目用了mongodb,然後mongodb一切都是按照默認設置,一切都好,但某日被查出安全漏洞,說mongodb要設置用戶和密碼什麼的

解決方案:自然就是在mongodb裏面設置密碼,但是遇到了不少的坑,其中最大的坑就是mongodb的3.X身份驗證方式,搜了很多文章都沒有提到這一點,光說了如何建立用戶名密碼,卻沒有考慮到項目連接的需求,導致建立了用戶,客戶端可以連,怎麼操作都是好的,但項目就是連不上,死活報權限驗證失敗

 

mongodb設置用戶密碼的過程:

1、首先正常啓動mongodb,然後用mongo.exe或者mongo(linux下)來連接mongodb

2、連接進去之後,先改mongodb的身份驗證方式,mongodb2.X版本用的是MONGODB-CR方式,而3.X用的是SCRAM-SHA-1方式,這個不修改的話,項目裏面的第三方包無法使用用戶名密碼方式連接mongodb (就算你用戶名密碼所有參數全對,也會報權限驗證失敗),這是修改身份驗證方式的指令(一共4行,一行一行輸入進去即可):

use admin
var schema = db.system.version.findOne({"_id" : "authSchema"})
schema.currentVersion = 3
db.system.version.save(schema)

3、改完之後,切換到你需要的庫下面,新建用戶(下面指令中的readWrite是意思是讀寫權限,一般業務來說,讀寫權限足夠了,有需要其他權限自行百度)

use mydatabase
db.createUser({user:"用戶名",pwd:"密碼",roles:[{role:"readWrite",db:"數據庫名稱"}]})

新建用戶完成,就可以退出mongodb了,然後修改mongodb啓動的配置文件,在最後加上--auth ,重新啓動mongodb(如果用配置文件方式的話也可以,具體的指令可以去搜一下)

4、mongodb的準備已經做完了,下面就是項目方面的準備,這裏以java連接mongodb爲例,放個工具類


import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


public class MongoClients {

    public static MongoClient mongoClient=null;

    public static MongoClient init(){
        InputStream in=null;
        Properties pro=null;
        MongoClient client=null;
        try {
           
            String host = "127.0.0.1";//mongodb的地址
            int port = 8080;//端口
            String pwd="1";//密碼
            String user="myuser";//用戶名
            String db="mydb"//數據庫名
            //如果沒有用戶名密碼和數據庫名,說明是無保護的mongodb,則不需要賬號密碼數據庫連接
            if(isEmpty(pwd)||isEmpty(user)||isEmpty(db)){
                client= new MongoClient(host, port);
                return client;
            }

            //ServerAddress()兩個參數分別爲 服務器地址 和 端口
            ServerAddress serverAddress = new ServerAddress(host,port);
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();
            addrs.add(serverAddress);

            //MongoCredential.createPlainCredential()三個參數分別爲 用戶名 數據庫名稱 密碼
            MongoCredential credential = MongoCredential.createMongoCRCredential(user, db, pwd.toCharArray());
            List<MongoCredential> credentials = new ArrayList<>();
            credentials.add(credential);
            //返回一個mongoClient對象,可以用這個對象做雜七雜八的事了
            client = new MongoClient(addrs,credentials);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return client;
    }

    public static MongoClient getMongoClient(){
        if(null==mongoClient){
            mongoClient=init();
        }
        return mongoClient;
    }

    /**
     * 判斷一個字符串是否爲空
     */
    public static boolean isEmpty(String str) {
        return null==str||"".equalsIgnoreCase(str);
    }
}

 

其他知識點

1、mongod是有安全模式和非安全模式區分的,安全模式就是啓動時加上 --auth ,非安全模式就是不加。如果你設置了用戶名密碼,那麼就必須開啓安全模式,否則無效

2、mongodb中切換數據庫:use admin   切換到admin庫    切換到其他庫只要把後面庫名換一下就好

3、新增用戶的指令:createUser({user:"",pwd:"",roles:[{role:"",db:""}]})       

user用戶名,pwd密碼,role是權限,權限有很多種,我這裏用readWrite(讀寫權限)就足夠了,db是數據庫名

注意大小寫,逗號,各種括號缺一不可,引號可以用單引號或者雙引號,這個不限制

4、刪除用戶的指令:dropUser("用戶名")

刪除用戶首先需要關閉安全模式(mongodb不使用--auth啓動),然後切換到對應的數據庫(use 數據庫名),然後用上面的指令刪除用戶

5、忘記用戶名密碼了怎麼辦?只能刪用戶重建(不過刪除用戶不影響數據),查看用戶的指令,我這裏不列舉了,自己搜索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章