SpringBoot中的多环境配置管理

SpringBoot中的多环境配置管理

文章目录

  • SpringBoot中的多环境配置管理
      • SpringBoot中的多环境配置管理
    • 多环境配置的概述
      • 1. 为什么需要多环境配置?
      • 2. Spring Boot 中如何实现多环境配置?
      • 3. 多环境配置的应用场景
      • 4. 如何实现配置隔离?
    • Spring Boot 中的配置文件管理
      • 1. 配置文件的类型
      • 2. 配置文件的基本结构
      • 3. 配置文件的优先级与加载顺序
      • 4. Profile 和配置文件的切换
      • 5. 配置文件的外部化
      • 6. 敏感信息的管理
      • 7. 多环境配置的最佳实践
    • 使用 Profiles 管理不同环境配置
      • 1. 什么是 Profile?
      • 2. 如何使用 Profiles 管理环境配置?
        • 2.1 定义和激活 Profile
        • 2.2 根据 Profile 加载配置文件
      • 3. 使用 @Profile 注解在代码中区分不同环境
      • 4. 配置文件的优先级与覆盖
      • 5. Spring Boot Profile 的常见实践
    • Spring Boot 配置的外部化
      • 1. 外部化配置的概念
      • 2. 外部化配置的常见方式
        • 2.1 使用外部配置文件
        • 2.2 使用环境变量
        • 2.3 通过命令行参数
        • 2.4 使用 Spring Cloud Config
      • 3. 优先级与加载顺序
      • 4. 敏感信息的外部化
      • 5. 配置文件的分层管理
    • 不同环境配置的实现
      • 1. Spring Boot 配置文件的多环境管理
        • 1.1 Profile 的概念
        • 1.2 不同环境的配置文件
        • 1.3 Profile 的激活
        • 1.4 配置文件的加载顺序
      • 2. 环境特定配置的管理
        • 2.1 开发环境配置 (application-dev.properties)
        • 2.2 生产环境配置 (application-prod.properties)
        • 2.3 测试环境配置 (application-test.properties)
      • 3. 配置的外部化
    • 配置文件加密与敏感数据保护
      • 1. 敏感数据保护的需求
      • 2. 配置文件加密的策略
      • 3. Spring Boot 配置文件的加密
      • 4. Jasypt 配置文件加密
        • 4.1 引入 Jasypt 依赖
        • 4.2 加密配置属性
        • 4.3 在配置文件中使用加密后的数据
        • 4.4 配置解密
      • 5. 使用 Spring Cloud Config 与 Vault 保护敏感数据
        • 5.1 配置 Vault
        • 5.2 Spring Cloud Config 集成 Vault
        • 5.3 从 Vault 获取配置
        • 6. 环境变量加密配置

SpringBoot中的多环境配置管理

在开发实际的 Java 应用时,通常会遇到不同的运行环境,比如开发环境、测试环境和生产环境。每个环境都有不同的配置需求,例如数据库连接信息、服务端口、日志级别等。如果我们没有一个灵活的机制来区分和管理这些不同环境下的配置,代码中的配置就会变得混乱且不易维护。

在这里插入图片描述

Spring Boot 提供了强大的多环境配置管理功能,能够帮助我们根据不同的环境加载不同的配置文件,从而让应用在不同的环境下能保持一致性和灵活性。通过合理使用 Spring Boot 的 Profile 功能,我们可以在开发、测试和生产等不同环境中,动态地切换配置,避免了硬编码配置的麻烦,提高了系统的可维护性。

多环境配置的概述

​ 在开发和部署应用程序时,通常会遇到多个不同的运行环境,例如开发环境、测试环境和生产环境。这些环境之间的差异主要体现在配置上,包括数据库连接、服务端口、日志级别、API 密钥等。为了更好地管理这些差异,Spring Boot 提供了多环境配置的机制,允许在不同的环境下加载不同的配置文件,从而使应用在各个环境中保持灵活性和一致性。

在这里插入图片描述

1. 为什么需要多环境配置?

多环境配置的需求来源于应用在不同阶段和环境中可能需要不同的设置。比如:

● 开发环境:我们通常使用本地的数据库、较低的日志级别、调试信息等。

● 测试环境:需要连接到测试数据库,执行一些集成测试,可能会使用一些测试专用的配置。

● 生产环境:生产环境中的数据库通常需要更高的安全性和性能,日志级别也可能需要调整为较低的日志记录级别,以提高系统性能。

通过将这些配置分开,我们能够更好地管理应用程序,并确保它在不同环境下的表现符合预期。

2. Spring Boot 中如何实现多环境配置?

Spring Boot 通过 Profiles 来支持多环境配置,允许在不同环境中加载不同的配置文件。每个配置文件可以针对不同的环境做出定制,比如:

● application.properties 或 application.yml:这是 Spring Boot 默认的配置文件。

● application-dev.properties 或 application-dev.yml:用于开发环境的配置文件。

● application-prod.properties 或 application-prod.yml:用于生产环境的配置文件。

Spring Boot 通过 spring.profiles.active 属性来标记当前使用的配置文件,动态切换不同的环境配置。

3. 多环境配置的应用场景

● 开发:在开发过程中,通常会使用本地数据库、调试模式和其他开发工具的配置。

● 测试:集成测试、单元测试等需要连接测试环境的数据库或第三方服务,并根据测试要求配置环境。

● 生产:生产环境通常需要更高的安全性和性能配置,比如使用外部服务、生产级数据库连接、严格的日志管理等。

4. 如何实现配置隔离?

在 Spring Boot 中,可以通过以下方式实现不同环境的配置隔离:

● Profile 区分配置:使用 @Profile 注解或在配置文件中通过 application-{profile}.properties 来区分环境。

● 外部化配置:Spring Boot 支持将配置放在外部文件或系统环境变量中,从而使得每个环境的配置不需要硬编码到应用中。

Spring Boot 中的配置文件管理

在 Spring Boot 中,配置文件是管理应用程序设置的关键部分。Spring Boot 提供了一种简单而灵活的方式来处理配置,支持多种配置格式、层次结构、环境隔离等特性。

在这里插入图片描述

1. 配置文件的类型

Spring Boot 默认支持两种配置文件格式:

application.properties:这是传统的 Java 属性文件格式,每个配置项以 key=value 的形式存在。

application.yml:YAML 格式的配置文件,比 properties 格式更具层次性和可读性,尤其对于结构化数据的表示非常方便。

这些文件可以存放在项目的 src/main/resources 目录下,并且可以根据不同的环境进行灵活管理。

2. 配置文件的基本结构

application.properties 示例:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret

application.yml 示例:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret

YAML 格式通过层级缩进来表示结构,能够更清晰地组织和表达配置数据。

3. 配置文件的优先级与加载顺序

Spring Boot 在启动时会按照一定的顺序加载配置文件,配置文件的加载优先级依次递增:

  1. 命令行参数:通过命令行传入的参数优先级最高。

  2. application.propertiesapplication.yml:项目中的配置文件,默认加载。

  3. 外部配置文件:可以通过 spring.config.location 指定外部的配置文件路径。

  4. 环境变量:如果没有在配置文件中找到某项配置,Spring Boot 会查找环境变量。

  5. Java System 属性:如 -D 参数传入的系统属性。

4. Profile 和配置文件的切换

在 Spring Boot 中,Profile 是一种用于标识不同运行环境的机制,可以帮助我们在不同的环境下加载不同的配置。

● 指定 Profile:可以在 application.properties application.yml 中使用 spring.profiles.active 属性指定当前的运行环境(如开发、测试、生产等)。

spring.profiles.active=dev

● 环境特定的配置文件:可以创建专门为某个环境定制的配置文件,如 application-dev.properties、application-prod.properties。这些文件会根据当前活动的 Profile 被自动加载。

○ application-dev.properties 示例:

spring.datasource.url=jdbc:mysql://dev-db:3306/mydb

○ application-prod.properties 示例:

spring.datasource.url=jdbc:mysql://prod-db:3306/mydb

5. 配置文件的外部化

Spring Boot 允许将配置文件外部化,避免硬编码在应用中。常见的外部化方式有:

● 通过命令行参数指定:

java -jar myapp.jar --spring.config.location=file:/path/to/application.properties

● 通过环境变量指定:在容器化应用中(如 Docker),可以通过环境变量来指定配置。

● 配置文件路径的优先级:spring.config.locationspring.config.name 可以用于指定文件的位置和名称。

6. 敏感信息的管理

在配置文件中,可能会涉及到敏感信息(如数据库密码、API 密钥等)。Spring Boot 提供了多种方式来保护这些敏感配置:

● 加密配置:使用 jasypt-spring-boot 等工具来加密配置文件中的敏感信息。

● 环境变量管理:将敏感信息放在系统环境变量中,而非配置文件中。

7. 多环境配置的最佳实践

在 Spring Boot 项目中,推荐使用如下方式来管理多环境配置:

  1. 使用不同的配置文件:为不同的环境(如开发、测试、生产)创建不同的配置文件,并通过 spring.profiles.active 动态切换。

  2. 外部化配置:配置文件放置在项目之外,通过命令行、环境变量等方式动态传入,避免将敏感信息和配置暴露在代码中。

  3. 减少重复配置:利用 Spring Boot 提供的配置继承和共享功能,减少不同环境中重复配置的量。

  4. 集中管理敏感配置:使用配置中心(如 Spring Cloud Config)集中管理敏感信息和环境配置。

使用 Profiles 管理不同环境配置

在开发和部署应用程序时,通常会遇到不同的运行环境,例如开发环境、测试环境、生产环境等。每个环境的配置需求往往不同,比如数据库连接、服务端口、日志级别等。为了在不同的环境中灵活地加载和管理配置,Spring Boot 提供了 Profiles 功能来实现多环境配置的管理。

1. 什么是 Profile?

Spring Boot 的 Profile 是一种标识和管理不同环境的机制,可以根据当前激活的 Profile 来加载不同的配置文件或配置项。通过 Profile,开发者可以在开发、测试、生产等多个环境中维护不同的配置,避免在同一个配置文件中管理所有环境的配置。

2. 如何使用 Profiles 管理环境配置?

2.1 定义和激活 Profile

Profile 是通过 @Profile 注解或者通过配置文件来激活的。在 Spring Boot 中,可以通过两种方式来指定当前使用的 Profile:

  1. 在配置文件中设置: 在 application.propertiesapplication.yml 文件中,可以通过 spring.profiles.active 来设置当前激活的 Profile。
# application.properties
spring.profiles.active=dev

或者,在 application.yml 中设置:

spring:
  profiles:
    active: dev

这里,dev 就是当前激活的 Profile。

  1. 通过命令行参数激活: 在启动应用时,可以通过命令行传入 -Dspring.profiles.active 参数来指定 Profile。例如:
java -jar myapp.jar --spring.profiles.active=prod
  1. 通过环境变量激活: 还可以通过系统环境变量 SPRING_PROFILES_ACTIVE 来指定激活的 Profile。例如,在 Linux 或 macOS 中:
export SPRING_PROFILES_ACTIVE=prod

然后启动应用。

2.2 根据 Profile 加载配置文件

Spring Boot 会根据当前激活的 Profile 来加载对应的配置文件。例如,假设你有多个不同环境的配置文件:

● application-dev.properties:开发环境配置

● application-prod.properties:生产环境配置

● application-test.properties:测试环境配置

如果在 application.properties 或 application.yml 中配置了 spring.profiles.active=dev,那么 Spring Boot 会加载 application-dev.properties 文件中的配置。不同的 Profile 可以有不同的配置文件,Spring Boot 会根据激活的 Profile 加载与之匹配的配置文件。

3. 使用 @Profile 注解在代码中区分不同环境

除了在配置文件中使用 Profile,Spring Boot 还允许我们在代码中使用 @Profile 注解来根据 Profile 的激活与否选择是否加载某些 Bean。例如:

@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource dataSource() {
        // 开发环境的数据源配置
        return new DataSource("dev-db-url");
    }
}
@Configuration
@Profile("prod")
public class ProdConfig {
    @Bean
    public DataSource dataSource() {
        // 生产环境的数据源配置
        return new DataSource("prod-db-url");
    }
}

在上面的示例中,只有当 dev Profile 被激活时,DevConfig 中的配置才会生效;只有当 prod Profile 被激活时,ProdConfig 中的配置才会生效。

4. 配置文件的优先级与覆盖

在多个配置文件中,如果有相同的配置项,Spring Boot 会根据文件的加载顺序和 Profile 的优先级来决定最终的配置值。例如:

  1. application.properties:所有环境通用的配置。

  2. application-dev.properties:开发环境专用配置。

  3. application-prod.properties:生产环境专用配置。

如果在 application.properties 中配置了 server.port=8080,在 application-prod.properties 中配置了 server.port=80,并且激活了 prod Profile,那么最终的端口配置会使用 application-prod.properties 中的 server.port=80

5. Spring Boot Profile 的常见实践

● 使用环境变量:通过环境变量来设置不同的 Profile,可以方便地在不同的部署环境中切换配置。

● 配置多套数据库连接:开发环境使用本地数据库,生产环境使用生产数据库,测试环境使用专门的测试数据库。可以通过不同的 Profile 文件来配置不同的数据库连接。

● 不同的日志级别配置:在开发环境中,可能需要更详细的日志信息,而生产环境则需要更简洁的日志,以提高性能。通过 Profile 可以灵活配置不同的日志级别。

● 外部配置管理:可以通过外部的配置文件来管理环境配置,使得应用可以在不同环境下保持一致性,尤其适合容器化和微服务架构中的配置管理。

Spring Boot 配置的外部化

​ Spring Boot 提供了灵活的配置机制,可以轻松将应用程序的配置外部化,避免将敏感信息(如数据库密码、API 密钥等)硬编码在代码中。外部化配置不仅可以使应用程序更具可维护性,还能提高灵活性和安全性。尤其在容器化、微服务架构中,外部化配置变得尤为重要。

1. 外部化配置的概念

外部化配置指的是将应用程序的配置从代码中分离出来,将其存储在外部位置(如文件、环境变量、配置服务器等)。Spring Boot 支持从多种外部源加载配置,这样就可以避免每次更改配置时都需要重新构建和部署应用程序。

2. 外部化配置的常见方式

Spring Boot 提供了多种外部化配置的方式,可以根据需求选择合适的方法。

2.1 使用外部配置文件

Spring Boot 支持将配置文件放在项目外部,或者通过命令行传入外部配置。常见的做法是使用 application.propertiesapplication.yml,并将其存放在外部目录。

  1. 通过命令行参数指定配置文件路径:可以通过 --spring.config.location 参数指定配置文件的路径。例如,在启动命令中指定配置文件:
java -jar myapp.jar --spring.config.location=file:/path/to/application.properties
  1. 通过环境变量指定配置文件路径:使用环境变量来指定配置文件的位置。在 Linux 或 macOS 中:
export SPRING_CONFIG_LOCATION=/path/to/application.properties
java -jar myapp.jar
2.2 使用环境变量

Spring Boot 支持通过操作系统的环境变量来覆盖配置文件中的设置。环境变量的优先级高于配置文件中的属性,特别适合用于存储敏感信息或在生产环境中动态配置参数。

● 通过环境变量配置数据库连接:

export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=secret

这些环境变量会覆盖 application.properties 文件中的相应配置。

2.3 通过命令行参数

Spring Boot 允许在启动应用时通过命令行参数传递配置值,命令行参数的优先级最高。例如:

java -jar myapp.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://localhost:3306/testdb

这将覆盖 application.properties 中的相应配置。

2.4 使用 Spring Cloud Config

对于复杂的微服务架构,Spring Cloud 提供了配置中心(Spring Cloud Config)来集中管理和外部化配置。配置中心可以将所有应用的配置统一存储在 Git 仓库、数据库或文件系统中,并通过 HTTP 服务提供给应用使用。

  1. 配置中心的工作原理

​ ○ 应用从 Spring Cloud Config 服务器拉取配置。

​ ○ 配置可以按环境、按应用进行划分,支持动态刷新和更新。

  1. 配置中心的优势

​ ○ 集中管理:多个微服务共享配置,统一管理。

​ ○ 动态刷新:通过 Spring Cloud Bus 可以实现配置的动态刷新,无需重启应用。

​ ○ 版本控制:通过 Git 实现配置的版本控制。

3. 优先级与加载顺序

Spring Boot 会按照一定的优先级加载配置项,如果不同来源的配置项有重复,后加载的配置将覆盖前加载的配置。配置的加载顺序如下:

  1. 命令行参数:优先级最高。

  2. application.propertiesapplication.yml:项目中的配置文件。

  3. 外部配置文件:通过 spring.config.location 指定的外部配置文件。

  4. 环境变量:操作系统的环境变量。

  5. 系统属性:如 -D 参数传入的系统属性。

因此,如果在不同的位置配置了相同的属性,Spring Boot 会使用优先级更高的配置。

4. 敏感信息的外部化

为了确保应用程序的安全性,敏感信息(如数据库密码、API 密钥等)不应该存储在版本控制系统中。Spring Boot 提供了以下几种方式来处理敏感信息:

● 环境变量:将敏感信息存储在环境变量中,而不是硬编码在配置文件中。

● 加密配置:使用加密工具,如 Jasypt,加密配置文件中的敏感信息,然后在运行时解密。

例如,使用 Jasypt 加密 application.properties 文件中的数据库密码:

spring.datasource.password=ENC(encrypted_password)

5. 配置文件的分层管理

为了管理不同环境下的配置,Spring Boot 允许根据不同的 Profile 使用不同的配置文件。例如,可以为开发、测试、生产环境创建不同的配置文件,Spring Boot 会根据当前激活的 Profile 加载相应的配置。

application-dev.properties:开发环境配置。

application-prod.properties:生产环境配置。

application-test.properties:测试环境配置。

激活 Profile 后,Spring Boot 会自动加载相应的配置文件:

# application.properties
spring.profiles.active=dev

或者,通过命令行参数指定 Profile:

java -jar myapp.jar --spring.profiles.active=prod

不同环境配置的实现

在实际的开发和部署中,应用程序通常需要在多个环境中运行,例如开发环境、测试环境和生产环境。每个环境的配置通常会有所不同,如数据库连接、缓存配置、日志级别等。Spring Boot 提供了多种方式来管理和切换不同环境的配置,以便在不修改代码的情况下,能够根据环境的不同自动加载对应的配置。

1. Spring Boot 配置文件的多环境管理

Spring Boot 允许通过使用不同的配置文件来管理不同环境的配置。我们可以为每个环境创建独立的配置文件,并通过 Profile 来指定当前激活的环境。Spring Boot 会根据激活的 Profile 加载对应的配置文件。

1.1 Profile 的概念

Profile 是 Spring 框架的一种机制,用于标识和区分不同的环境。通过 Profile,可以在开发环境、测试环境和生产环境之间切换配置,确保每个环境有合适的配置。

1.2 不同环境的配置文件

Spring Boot 通过 application.propertiesapplication.yml 文件来存储配置。为了支持多环境配置,我们可以创建多个配置文件,按照环境的不同进行区分。

application.propertiesapplication.yml:用于存储通用配置。

application-dev.propertiesapplication-dev.yml:用于开发环境配置。

application-prod.propertiesapplication-prod.yml:用于生产环境配置。

application-test.propertiesapplication-test.yml:用于测试环境配置。

1.3 Profile 的激活

要使用不同的配置文件,必须激活相应的 Profile,Spring Boot 提供了几种激活 Profile 的方式:

  1. 通过 spring.profiles.active 设置:可以在 application.propertiesapplication.yml 中通过 spring.profiles.active 属性来指定激活的 Profile。例如:
# application.properties
spring.profiles.active=dev

或者在 application.yml 中:

spring:
  profiles:
    active: dev
  1. 通过命令行参数激活:可以在启动应用时通过命令行传递 --spring.profiles.active 来激活 Profile:
java -jar myapp.jar --spring.profiles.active=prod
  1. 通过环境变量激活:可以通过设置操作系统的环境变量来激活 Profile。例如,在 Linux 或 macOS 中:
export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar
  1. 通过 @Profile 注解激活:在 Java 类中使用 @Profile 注解,只有当指定的 Profile 被激活时,相关的 Bean 才会被加载:
@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource dataSource() {
        return new DataSource("jdbc:mysql://localhost:3306/devdb");
    }
}
1.4 配置文件的加载顺序

Spring Boot 会根据 Profile 的优先级顺序加载配置文件:

  1. application.propertiesapplication.yml:这是全局的配置文件,适用于所有环境。

  2. application-{profile}.propertiesapplication-{profile}.yml:根据激活的 Profile 加载相应的配置文件。例如,如果激活的是 dev Profile,则加载 application-dev.properties 文件中的配置。

  3. 命令行参数和环境变量:如果配置文件中存在重复的属性,命令行参数和环境变量的值会覆盖配置文件中的值。

2. 环境特定配置的管理

为了更好地管理不同环境的配置,常见的做法是将敏感信息和环境特定的配置如数据库连接、第三方服务的 API 密钥、日志级别等单独管理。

2.1 开发环境配置 (application-dev.properties)

开发环境中的配置通常比较宽松,适合进行调试和测试。常见的开发环境配置有:

●数据库连接:使用本地数据库或开发环境的数据库。

●日志级别:通常设置为 DEBUG,以便在开发过程中查看详细的日志信息。

●缓存配置:开发环境可能不需要使用高性能的缓存,或者使用本地缓存。

# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/devdb
spring.datasource.username=dev_user
spring.datasource.password=dev_password
logging.level.root=DEBUG
2.2 生产环境配置 (application-prod.properties)

生产环境配置需要更加严格和高效,通常包括:

●数据库连接:连接生产数据库,通常使用更高效、稳定的数据库连接池。

●日志级别:生产环境通常设置为 INFO 或 WARN,以减少日志量,避免暴露敏感信息。

●安全配置:生产环境可能需要配置更严格的安全措施,如 HTTPS、API 密钥等。

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db-server:3306/proddb
spring.datasource.username=prod_user
spring.datasource.password=prod_password
logging.level.root=INFO
2.3 测试环境配置 (application-test.properties)

测试环境中的配置主要用于单元测试和集成测试,通常包括:

●使用测试数据库(如 H2 数据库)或内存数据库。

●配置测试特定的日志级别和性能参数。

●配置模拟服务或 Mock 数据。

# application-test.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=test_user
spring.datasource.password=test_password
logging.level.root=DEBUG

3. 配置的外部化

​ 对于一些敏感数据(如数据库密码、API 密钥等),可以将配置外部化到环境变量、命令行参数或配置服务器中,避免将敏感信息写入配置文件。Spring Boot 支持从环境变量、JNDI、命令行参数、Spring Cloud Config 等多种外部化方式读取配置。

配置文件加密与敏感数据保护

在现代应用程序中,配置文件通常包含敏感数据,如数据库密码、API 密钥、用户名等。如果这些信息被泄露,可能会导致严重的安全问题。因此,如何保护配置文件中的敏感数据,是开发和运维过程中必须关注的重点。Spring Boot 提供了多种方式来加密配置文件中的敏感数据,确保在使用配置文件时,不会暴露敏感信息。

1. 敏感数据保护的需求

在开发和生产环境中,敏感数据的保护尤为重要。常见的敏感数据包括:

● 数据库密码、用户名

● 第三方 API 密钥

● OAuth2 客户端密钥

● 访问令牌(Access Token)

为了防止敏感数据的泄露,我们通常会采取加密手段,确保即使配置文件被非法访问,也无法获取敏感信息。

2. 配置文件加密的策略

加密配置文件中的敏感数据,常见的方式有:

  1. 对称加密:使用相同的密钥对敏感数据进行加密和解密。常见的对称加密算法有 AES(高级加密标准)。这种方式要求在应用程序启动时,通过安全的方式提供解密密钥。

  2. 非对称加密:使用公钥加密,私钥解密。适用于需要更高安全性的场景,通常用于数据交换和密钥管理。

  3. 基于属性的加密:仅对配置文件中的特定属性进行加密。例如,可以只加密数据库连接字符串中的密码部分,而保留其他非敏感信息明文。

3. Spring Boot 配置文件的加密

Spring Boot 并没有直接提供加密配置文件的功能,但可以通过结合第三方库来实现加密。常用的加密方案包括:

● Jasypt(Java Simplified Encryption):这是一个开源的加密工具,可以用来加密配置文件中的敏感数据。它支持对属性进行加密和解密,并提供简单的集成方式。

● Spring Cloud Config + Vault:Spring Cloud Config 提供了集中式配置管理,Vault 是 HashiCorp 提供的安全工具,专门用于存储和保护敏感数据。结合 Vault 和 Spring Cloud Config,可以有效地加密配置文件中的敏感信息。

4. Jasypt 配置文件加密

Jasypt 是 Java 中最常用的加密工具之一,它提供了易于集成的加密方案,适合用来加密 Spring Boot 配置文件中的敏感信息。

4.1 引入 Jasypt 依赖

首先,在 pom.xml 中添加 Jasypt 的依赖:

<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
4.2 加密配置属性

使用 Jasypt 加密属性时,首先需要对敏感数据进行加密。可以通过 Jasypt 提供的工具进行加密,示例如下:

import org.jasypt.util.text.BasicTextEncryptor;

public class EncryptPassword {
    public static void main(String[] args) {
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword("secretKey");  // 设置加密密钥
        String encryptedPassword = encryptor.encrypt("myPassword123");  // 加密敏感信息
        System.out.println(encryptedPassword);
    }
}
4.3 在配置文件中使用加密后的数据

将加密后的密码放入 application.properties 或 application.yml 中,格式为 ENC(…):

spring.datasource.password=ENC(1y2l1G0Uht9HgddKxsT8Tg==)
4.4 配置解密

在 Spring Boot 启动时,Jasypt 会自动解密这些加密过的配置项。为此,需要在 application.properties 中配置解密所需的密钥:

jasypt.encryptor.password=secretKey

当 Spring Boot 启动时,它会使用 secretKey 来解密配置文件中的敏感数据,并将其加载到 Spring 环境中。

5. 使用 Spring Cloud Config 与 Vault 保护敏感数据

​ Spring Cloud Config 与 HashiCorp Vault 是用于集中式配置和敏感数据存储的强大工具。Vault 提供了一个安全的存储库,用于存储应用程序的敏感数据,如 API 密钥、数据库凭证等。Spring Cloud Config 可以与 Vault 集成,以便在应用程序启动时从 Vault 中读取敏感配置。

5.1 配置 Vault

首先,您需要设置 Vault 服务器,并将敏感数据存储到 Vault 中。例如,将数据库密码存储为一个密钥:

vault kv put secret/myapp/db password="my-secret-password"
5.2 Spring Cloud Config 集成 Vault

application.properties 中配置 Vault 作为配置源:

spring.cloud.config.uri=http://localhost:8888  # Spring Cloud Config 服务器的地址
spring.cloud.config.server.vault.backend=secret  # 配置 Vault 密钥后端
spring.cloud.config.server.vault.default-context=myapp
5.3 从 Vault 获取配置

​ 当应用程序启动时,Spring Cloud Config 会自动从 Vault 中加载敏感数据,而不会暴露敏感数据在配置文件中。例如,password 就会从 Vault 中安全地加载,而不会被硬编码在配置文件里。

6. 环境变量加密配置

在某些情况下,环境变量是一个比配置文件更安全的存储敏感信息的方式。例如,可以通过 CI/CD 系统或 Docker 等平台将密钥和密码设置为环境变量,这样它们不会出现在配置文件或源代码中。

Spring Boot 支持通过环境变量读取配置:

spring.datasource.password=${DB_PASSWORD}

通过 export DB_PASSWORD=my-secret-password 来设置环境变量,Spring Boot 会在启动时读取该值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SOME/IP报文格式及发现协议详解

在之前的文章中&#xff0c;我们介绍了SOME/IP协议的几种服务接口。在本篇博客中&#xff0c;主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。 目录 流程 报文格式 Message ID Length Request ID protocal version/Interface Version Message Type…

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…

约束布局属性学习

1、layout_constraintHorizontal_bias layout_constraintHorizontal_bias 是 ConstraintLayout 中的一个重要属性&#xff0c;用于控制一个视图在父视图或相关视图中水平位置的偏移。这种偏移通过在0到1之间的浮点值来设置&#xff0c;0代表完全靠近左边或起始位置&#xff0c…

Windows双网卡冲突导致网页加载过慢的解决方法 (修改跃点无效 远程桌面连接)

【本文发布于https://blog.csdn.net/Stack_/article/details/145494160&#xff0c;未经许可不得转载&#xff0c;转载须注明出处】 办公室内&#xff0c;我的笔记本和台式机都连接WIFI进行上网&#xff0c;网段是192.168.0.x&#xff0c;网关192.168.0.101 现在要通过Windows自…

轻量级服务器http-server

安装 sudo npm install http-server -g 运行 1. 直接去到要跑起来的目录&#xff0c;在终端输入 cd xxxx文件夹http-server //只输入http-server的话&#xff0c;更新了代码后&#xff0c;页面不会同步更新http-server -c-1 //同步更新页面http-server -a 127.0.0.1 -p 808…

代码随想录算法【Day38】

Day38 322. 零钱兑换 思路 完全背包 代码 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i < coins.size(); i) { // 遍历物品for (int j coins[i]; j <…

python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! python+opencv+open3d实现鼠标手画多边形裁剪分割点云操作 引言使用效果:代码pcd_roi_crop.py:引言 当我们想对一个不规则物体的图像或者点云裁剪时,直接手动输入…

STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…

Redis05 - 性能调优和缓存问题

Redis性能调优和缓存问题 文章目录 Redis性能调优和缓存问题一&#xff1a;链路追踪判断是不是redis出了问题二&#xff1a;redis变慢原因1&#xff1a;使用复杂度过高的命令(*)1.1&#xff1a;查看redis慢日志1.2&#xff1a;延迟变大原因分析1.3&#xff1a;解决方案 2&#…

漫步 C++ 之途,领略引用的独特风姿

在C中&#xff0c;引用&#xff08;Reference&#xff09;是一种非常有用的特性&#xff0c;它允许为一个变量创建一个别名&#xff08;Alias&#xff09;。引用在很多情况下可以替代指针&#xff0c;但使用起来更加方便和安全。以下是对C引用的详细介绍&#xff0c;包括其定义…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

Java 多线程、线程同步、线程池

一. 线程 1. 线程&#xff1a;线程(Thread)是一个程序内部的一条执行流程。 2. 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 二. 多线程 多线程是指从硬件上实现多条执行流程的技术(多条线程由CPU负责调度) Javas是通过java.lang.Thread类的对象来代…

20.[前端开发]Day20-王者荣耀项目实战(三)

01_(掌握)王者荣耀-main-赛事新闻列表实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

【Langchain学习笔记(一)】Langchain介绍

Langchain介绍 Langchain介绍前言1、Langchain 是什么2、为什么要用 Langchain3、Langchain 的核心4、Langchain 的底层原理5、Langchain 的应用场景 Langchain介绍 前言 想象一下&#xff0c;如果你能让聊天机器人不仅仅回答通用问题&#xff0c;还能从你自己的数据库或文件…

IDEA2024版本创建Sping项目无法选择Java 8

目录 一、背景二、解决方式&#xff08;替换创建项目的源地址&#xff09; 一、背景 IDEA2024创建一个springboot的项目&#xff0c;本地安装的是1.8&#xff0c;但是在使用Spring Initializr创建项目时&#xff0c;发现版本只有17、21、23。 二、解决方式&#xff08;替换创…

C++11(四)

目录 包装器 function包装器 bind绑定 更改实参传递的顺序和实参传递的个数 线程库 本期我们将继续进行C11新特性的学习。 包装器 function包装器 function包装器&#xff0c;我们也称之为适配器&#xff0c;本质上就是一个类模板&#xff0c;为什么要引入function包…

MySQL 数据库编程-C++

目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成&#xff1a…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…

动态规划LeetCode-1035.不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09;相…