我正在编写一个连接到数据库的 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/