在前面的两篇博客 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.mongodbgroupId> <artifactId>mongo-java-driverartifactId> <version>3.8.2version> dependency> <dependency> <groupId>org.springframework.datagroupId> <artifactId>spring-data-mongodbartifactId> <version>1.10.7.RELEASEversion> 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"> <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config.propertiesvalue> 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"/> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoDbFactory"/> bean> beans>