java - Spring data JPA - 不要在 XML 文件中硬编码密码

标签 java spring spring-boot spring-data-jpa

我正在编写一个连接到数据库的 Spring Jar(没有 Spring 引导)。我看到的几乎所有教程都使用 spring XML 连接到数据库,密码硬编码在 XML 文件中。 这在生产环境中是绝对不允许的,并且在安全方面超出标准。

如果有一种方法可以从方法调用中注入(inject)密码,该方法调用又会从安全保管库中检索密码并在运行时将密码提供给数据源对象,有人可以帮助我吗?

类似下面的内容。

    <bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
    <property name="username" value="postgres" />
    <property name="password" value=getPasswordfromSecureVault("username") />
    <property name="suppressClose" value="true" />
    <jdbc:initialize-database  >
    <jdbc:script location="create-tables.sql"/>
    </jdbc:initialize-database>

最佳答案

根据您拥有的 spring boot 标签,我假设您正在为您的项目使用 spring boot。使用 spring boot,很容易为您的应用程序外部化配置。如果您使用他们提供的启动器,它还会使用连接池自动配置您的数据源。

在您的情况下,您可以从转向使用 spring boot 的 Externalized Configuration 中获益。 . 允许您做的是使用环境变量来配置您的 spring 应用程序。例如,要配置您的密码,请使用环境变量 SPRING_DATASOURCE_PASSWORD。您还可以在启动应用程序时使用 Java 选项 -Dspring.datasource.password=[password],例如: java -jar -Dspring.datasource.password=password app.jar

如果使用 docker 容器,环境变量方式通常是我的首选,因为人们很容易理解它。

如果您真的想通过方法调用配置密码,您也可以使用 java 配置来实现。创建一个 DataSource 类型的 bean,Spring 应该选择并使用它。

@Configuration
class AppConfiguration {
    @Bean
    public DataSource dataSource() {
       String password = // Get your password
       return DataSourceBuilder.create().password(password).build();
    }
}

关于java - Spring data JPA - 不要在 XML 文件中硬编码密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61812314/

相关文章:

java - Android - 等待可运行完成

spring - Spring Retry 中异常表达式的使用

java - Spring Boot 和 Angular 身份验证 - 如何保护应用程序?

java - 为什么在独立 Tomcat 上部署时我的 RequestMapping 没有被拾取?它适用于 Eclipse WTP

java - 使用多个 Jcheckbox 的 JTable 过滤器

java - @PropertyId注释 "is disallowed for this location"

java - 如何使启动时的 Spring Boot 自定义异常不致命?

spring - 从 Spring Boot 2.1.9 升级到 2.2.1 (Spring Integration) 后的 ClassCastException

java - 如何在给定名称和形式参数类型的情况下检索 Method 对象?

java - 带有 Hystrix 断路器超时默认为 2 秒的 Spring Cloud Feign 客户端