spring boot基于DRUID数据源密码加密及数据源监控实现

前言

随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高。今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但是数据源加密却涉及到我们的系统安全。对于平时的学习测试,我们在项目中配置数据库明文密码是没什么问题的,因为我们的数据不重要,也就无所谓,但是在现实环境下的生产平台,配置明文密码极有可能会造成我们数据库密码泄露,最终导致我们的生产数据泄露,这也就体现了生产环境数据源加密的必要性。下面我们就来看看如何实现数据源加密吧。

创建spring boot项目

创建过程就不赘述了,下面是我的项目依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.githu.syske</groupId>
    <artifactId>druid-datasouce-decrypt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>druid-datasouce-decrypt</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- 阿里巴巴druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

如果你的数据库是Oracle,那么你要把mysql的数据库驱动替换成Oracle驱动

修改spring boot项目配置信息
server:
  port: 8083

我采用的是yaml的方式,然后启动你的项目,因为没有controller和其他的代码,所以没什么效果,但是项目可以正常启动。

加密数据源密码,创建publickey

这里没什么好讲的,我直接放代码:

import org.junit.Test;

/**
 * @program: druid-datasouce-decrypt
 * @description:
 * @author: liu yan
 * @create: 2019-12-02 18:34
 */
public class DBencrydtTest {
    @Test
    public void test() {
        String[] args = {"root"};
        try {
            com.alibaba.druid.filter.config.ConfigTools.main(args);
        } catch (Exception e) {

        }

        System.out.println();
    }
}

需要说明的是,args数组中放置的是密码,直接运行上面的代码,你会看到控制台会打印如下信息:

privateKey:MIIBVAIBADANBgkqhkiFWERAERFrterfgdggE6AgEAAkEAqboz+iNXPv1jgKAhDW7W+L/NwqG6GDTo49BjmlMg3WxBg4w9h4RC3oRO40EOjL7+DtEBBlCZ6OHZfZWKh17FmwIDAQABAkA/azwQszPebX/IiAzRoCDjQYf4ucV3Vg3PUgZlm7okAbsXrxz2xrdnM8Er08YKm3vUOmWQmSvaOI3CqdrK1f2BAiEA4XbEkCOxWVxbDLihyudClvrgLbZZyODlx5E2phn4gXMCIQDAtvMeJiXlGQBxFr/ci0r99FiYUeag/ZFwOjyhIzWBOQIgYg3bEqzTNn/aAUBS7QGCjlLxKDBD//7/L7nRwI9O6k0CIQCdBnUiY8MM4UpS206JzZXVR3vI4TMiinovD8THJ4E5QQIgRM1QlD1PG5YTxBxZMrLm2weBxsqXhvdJuTc1GXmoUxg=
publicKey:MFwwDQYJKoZIhvcewrwerfrrgfg43534M/ojVz79Y4CgIQ1u1vi/zcKhuhg06OPQY5pTIN1sQYOMPYeEQt6ETuNBDoy+/g7RAQZQmejh2X2ViodexZsCAwEAAQ==
password:O9JBjc86r9IhEoIE6jevJtgsgCXZAKCWH2UtO0tbG62zqIK5G5qJOCm1u9ju+lnno15vmq+TO5WqEWGzvkDNGg==

privateKey是你的私钥,publicKey是公钥,password就是你加密后的密码。我们用到的配置有两个,一个是公钥,一个是密码,配置公钥的原因是要通过公钥进行解密。将如上信息保存好,后面再spring boot的配置中要用到。

增加数据源相关配置

增加数据源配置信息:

# 阿里巴巴druid数据源配置
spring:
  datasource:
  # 数据源驱动类型,这里是druid
    type: com.alibaba.druid.pool.DruidDataSource
    # sql脚本编码
    sql-script-encoding: utf-8
    druid:
    # 驱动的类名
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 数据库连接密码
      username: root
      # 数据库地址
      url: jdbc:mysql://127.0.0.1:3307/spring?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai
      # 这里配置的是前面我们生成的密码
      password: Y2YOft/vPjw/JFPkevqZZKi8pCHu5ambR2ivSxgipTbL76pOoxNw3Un5Hcarbe9AqUImr+wS7YI6TjJZOVYjzA==
      # 这里设置连接配置,key配置的是我们前面生成的publicKey
      connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJI/xqbyvpVttxfAKulKeSTIb7tZAGaFcPyTnE2r7AHTQ8kOnqKXDda4u59umt9XBFxi7db28KxeVooB138zuRUCAwEAAQ==
      filter:
        config:
        # 启用druid的拦截器
          enabled: true
      # 连接池的配置信息
      # 初始化时建立物理连接的个数
      initial-size: 3
      # 连接池最小连接数
      min-idle: 3
      # 连接池最大连接数
      max-active: 20
      # 获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      # 既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-connect-error-millis: 60000
      # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
      min-evictable-idle-time-millis: 30000
      # 用来检测连接是否有效的sql 必须是一个查询语句
      # mysql中为 select 'x'
      # oracle中为 select 1 from dual
      validationQuery: select 'x'
      # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      # 是否缓存preparedStatement,mysql5.5+建议开启
      pool-prepared-statements: true
      # 当值大于0时poolPreparedStatements会自动修改为true
      max-pool-prepared-statement-per-connection-size: 20
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: false
      # 配置扩展插件
      #监控统计拦截的filters
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 定时输出统计信息到日志中,并每次输出日志会导致清零(reset)连接池相关的计数器。
      time-between-log-stats-millis: 300000
      # 配置DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: '/*'
        exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
      # 配置DruidStatViewServlet
      stat-view-servlet:
        # 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
        enabled: true
        url-pattern: '/druid/*'
        # IP白名单(没有配置或者为空,则允许所有访问)
        allow: 127.0.0.1,192.168.0.1
        # IP黑名单 (存在共同时,deny优先于allow)
        deny: 192.168.0.128
        # 禁用HTML页面上的“Reset All”功能
        reset-enable: false
        # 登录名
        login-username: admin
        # 登录密码
        login-password: admin

上面备注已经很详细了,这里要强调的有两个地方,一个是key那里配置的是publicKey,不要配错了,一个是要注意 validationQuery这里mysql和Oracle是不一样的,当然你要可以移除该配置。

上面还加了数据源监控的配置信息,注释已经够详细了。以上配置完成后就可以启动你的项目了,如果没有报错,那说明你的配置没有问题,如果启动的时候报错,说明你的配置有问题。

项目启动后,要进入druid数据源监控页面,只需要输入如下你的项目地址+/druid即可,比如我的地址:

http://localhost:8083/druid

然后输入你在配置信息里面加入的用户名和密码,你就可以看见监控页面了,如果要查看sql相关监控信息,你还要完善自己的项目,引入mybatis,配置你的sql。

结语

至此,我们的项目就已经完成了,根据以上过程,我们发下数据源加密和监控的核心是要添加正确的配置信息。如果在实际开发过程中发下错误,最主要的还是要检查我们的配置是否正确。

原文地址:https://www.cnblogs.com/caoleiCoding/p/12000926.html

时间: 2024-10-12 23:00:26

spring boot基于DRUID数据源密码加密及数据源监控实现的相关文章

[转] Druid简介(Spring Boot + Mybatis + Druid数据源【自己定制】)

Druid的简介Druid是一个非常优秀的数据库连接池.在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSource. Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验. Druid是一个JDBC组件,它包括三个部分: 基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据库连接池. SQLParser Druid的功能兼容DBCPDruid提

Spring Boot 配置Druid数据源

Spring Boot 配置Druid数据源 Druid是阿里巴巴的一个开源项目,使用这个数据源的好处就是可以使用监控功能,提供了一个简单的后台,可以监控数据源的数据 配置方式 导入坐标 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</art

Spring Boot [使用 Druid 数据库连接池]

导读 最近一段时间比较忙,以至于很久没有更新Spring Boot系列文章,恰好最近用到Druid, 就将Spring Boot 使用 Druid作为数据源做一个简单的介绍. Druid介绍: Druid是阿里巴巴开源的数据库连接池,Druid号称是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能,Druid的官方地址 了解更多: JDBC连接池.监控组件 Druid (oschina) 快速上手: 下面来说明如何在 spring Boot 中配置使用Druid ,本例使用的持

Spring Boot 2.X(五):MyBatis 多数据源配置

前言 MyBatis 多数据源配置,最近在项目建设中,需要在原有系统上扩展一个新的业务模块,特意将数据库分库,以便减少复杂度.本文直接以简单的代码示例,如何对 MyBatis 多数据源配置. 准备 创建数据库 db_test SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_user -- -------------------------

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 应用监控

文章目录 1. 快速开始 2. 监控和管理端点3. 定制端点 2.1. health 应用健康指标 2.2. info 查看应用信息 2.3. metrics 应用基本指标 2.4. trace 基本的HTTP跟踪信息 2.5. shutdown关闭当前应用 4. 源代码 Spring Boot 提供运行时的应用监控和管理功能.本文,我们通过 HTTP 实现对应用的监控和管理. 快速开始 Spring Boot 监控核心是 spring-boot-starter-actuator 依赖,增加依赖

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控

文章目录 1. 内置 HealthIndicator 监控检测 2. 自定义 HealthIndicator 监控检测 3. 源代码 Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring Boot 内置了一些 HealthIndicator. 内置 HealthIndicator 监控检测 Name Description CassandraHealthIndicator Checks that a Cas

Spring Boot 揭秘与实战(九) 应用监控篇 - 自定义监控端点

文章目录 1. 继承 AbstractEndpoint 抽象类 2. 创建端点配置类 3. 运行 4. 源代码 Spring Boot 提供的端点不能满足我们的业务需求时,我们可以自定义一个端点. 本文,我将演示一个简单的自定义端点,用来查看服务器的当前时间,它将返回两个参数,一个是标准的包含时区的当前时间格式,一个是当前时间的时间戳格式. 继承 AbstractEndpoint 抽象类 首先,我们需要继承 AbstractEndpoint 抽象类.因为它是 Endpoint 接口的抽象实现,此

Spring boot 集成 Druid 数据源

Druid是阿里开源的一个JDBC应用组件,其中包括三部分: DruidDriver:代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource:高效可管理的数据库连接池. SQLParser:实用SQL语法分析 官方文档:https://github.com/alibaba/druid/wiki 依赖 pom.xml Druid Spring Boot Starter是阿里官方提供的Spring Boot插件,用于在Spring Boot项目中集成D

Spring Boot使用Druid和监控配置

Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. 下面来说明如何在 Spring Boot 中配置使用Druid (1)添加Maven依赖 (或jar包)\ <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId&g