場景:某項目用了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、忘記用戶名密碼了怎麼辦?只能刪用戶重建(不過刪除用戶不影響數據),查看用戶的指令,我這裏不列舉了,自己搜索