在前面的兩篇博客 MongoDB常用操作練習、springboot整合mongoDB的簡單demo中,我們基本上熟悉了mongodb,也把它與spring boot進行了整合並且簡單使用。在本篇博客中,將在spring項目中整合mongo,而且是帶用戶驗證,網上大部分spring整合mongodb的例程,都是不帶用戶驗證的,說白了就是沒有密碼,只要別人知道你的ip+port,那你的數據大白於天下。這不最近的新聞:MongoDB 裸奔,2 億國人求職簡歷泄漏!。數據庫泄露多可怕。所以只要是個數據庫,用戶驗證是必須的。但是我想不通的是mongodb這么流行的數據庫,竟然在安裝時不是默認設置用戶名和密碼的。帶着這個疑問進行整合吧。下面是整合過程(本文的mongo驅動mongo-java-driver是3.8.2,只要你的驅動是3.0.0版本以上就行)。
一、mongodb設置密碼
MongoDB中每個數據庫之間是相互獨立的,都有獨立的權限,mongodb默認沒有開啟驗證功能,以下為配置步驟(這個是linux的mongodb,windows的mongodb配置與其類似):
1) 在開啟驗證之前,需創建一個管理員用戶
$mongo
$db.createUser({user:"root",pwd: "root",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
創建一個管理員用戶root,密碼root,管理員用戶擁有userAdminAnyDatabase角色
2) 開啟mongodb驗證功能
進入mongodb配置文件進行修改,個人的地址為/etc/mongod.conf
$sudo vim /etc/mongod.conf
去掉"#auth = true"此行開頭的#號,保存后退出
3) 重啟mongodb服務
$sudo service mongod restart
4) 用創建的管理員用戶登錄
$mongo -u root -p root --authenticationDatabase admin
5) 增加需要用spring進行登錄的數據庫的用戶名、密碼和權限
$db.createUser({user:"abc", pwd:"abc2019", roles:[{role:"dbOwner", db:"test"}]})
遠程登錄mongodb test數據庫的用戶名為abc,密碼為abc2019,分配的權限為dbOwer。至此mongodb本地的認證配置完成。
二、pom.xml
這里我采用的驅動mongo-java-driver是3.8.2,如果你采用的驅動版本是3.*.*,那么整個整合過程與我講述的一致;如果是3.*.*版本以下的,那么和本文的配置是不一致的,最主要的體現在mongo-spring.xml中。
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.8.2</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.10.7.RELEASE</version> </dependency>
三、config.properties
# 開發
mongo.host = 127.0.0.1
mongo.port = 27017
mongo.userName = abc
mongo.password = abc2019
mongo.dbname = test
四、mongo-spring.xml
mongo:mongo-client標簽中的 credentials="${mongo.userName}:${mongo.password}@${mongo.dbname}"就是mongo數據庫的用戶驗證。格式為:用戶名:密碼@默認數據庫。如果你的mongo數據庫沒有認證,就可以去掉這句話,不過建議給數據庫加認證,這是安全着想。另外加上用戶驗證后,我們會發現整個配置中有兩處用到了mongo.dbname,對於這一點我現在都沒想清楚。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> <!-- 加載Properties文件 --> <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true"/> </bean> <mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}" credentials="${mongo.userName}:${mongo.password}@${mongo.dbname}"> <mongo:client-options connections-per-host="8" threads-allowed-to-block-for-connection-multiplier="4" connect-timeout="1000" max-wait-time="1500" socket-keep-alive="true" socket-timeout="1500"/> </mongo:mongo-client> <!-- 設置使用的數據庫名--> <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongo"/> <!-- mongodb的模板 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoDbFactory"/> </bean> </beans>