如何将文件的内容作为值传递给Spring属性?

cbwuti44  于 2023-11-16  发布在  Spring
关注(0)|答案(5)|浏览(127)

我使用Spring JPA访问我的数据库,但数据库的用户名和密码以两个文件的形式提供给我(username.txt和password.txt)。安全准则是我们不应该在配置文件中粘贴密码或任何形式的密码(加密)。
我在想办法做这样的事情:

spring.datasource:
  url: <db url>
  username: "file:/path/username.txt"
  password: "file:/path/password.txt"

字符串
有没有人知道如何实现类似的东西?
PS.我想在这个spring properties文件中保留特定于环境的凭据文件路径。有几种方法可以将文件内容作为环境变量java -Dusername=${cat /path/username}传入,但我想避免将我的配置放在spring properties文件之外。
编辑:用户名和密码以明文形式存储在单独的文件中。

20jt8wwn

20jt8wwn1#

Sping Boot 2.4引入了从文件中读取配置值的功能,其中目录和文件的名称是属性名称,文件内容是属性值。

path/
  spring/
    datasource/
      username
      password

字符串
application.yaml文件包含

spring.config.import: configtree:/path/


那么环境将包含名为spring.datasource.usernamespring.datasource.password的属性。

lzfw57am

lzfw57am2#

你不能从Spring application properties文件中读取文件的内容。但是你可以通过编程方式配置数据源,并在代码中读取文件。

@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource getDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("SA");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
}

字符串
请参阅this文章了解详细信息。我假设你知道如何使用Sping Boot 读取文件,如果不知道,你可以参阅this文章。

8xiog9wr

8xiog9wr3#

当我们搜索“Spring启动秘密”时,仍然首先弹出这篇(2016)文章:
Spring Vault
一些使用docker-secrets的现代方法(在这里):

但“务实地”和“最新的rce的${;}",我会提出这样的建议:

@Value("#{T(java.nio.file.Files).readString(T(java.nio.file.Path).of('/path/username.txt'))}")
String username;

// or having the path in a property (named db.password.file):
@Value("#{T(java.nio.file.Files).readString(T(java.nio.file.Path).of('${db.password.file}'))}")
String password;

字符串
感谢:

bkkx9g8r

bkkx9g8r4#

有多种方法可以加载另一个包含机密的配置文件(请参阅documentation
一个想法是创建一个特定于环境的应用程序.yaml(例如,application-prod.yaml只包含应用程序配置旁边的prod配置(您不需要将其打包到jar中,您可以仅在生产环境中将其放在jar旁边)。
另一个想法是使用-Dspring.config.additional-location=...加载额外的配置

jqjz2hbq

jqjz2hbq5#

虽然我不能说,这是一个好主意,但你可以读取文件内容的领域。但你必须做3个步骤
1.将文件路径添加到application.properties
第一个月

  1. find方法的实现,它可以将文件内容加载到单个字符串中。
    例如
public static String readPassword(String filePath) throws IOException {
        return FileUtils.readFileToString(new File(filePath), Charset.defaultCharset());
}

字符串
1.将SpEL表达式添加到字段,该表达式使用属性中的参数调用此方法

@Value("#{T (com.github.TestComponent).readPassword(\"${password.file}\")}")
    private String password;


在启动时,Spring将调用此方法并将结果放入password字段。
类可能看起来像

package com.github;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class TestComponent {

    @Value("#{T (com.github.TestComponent).readPassword(\"${password.file}\")}")
    private String password;
    
    public void showPassword() {
        System.out.println(password);
    }
    
    public static String readPassword(String filePath) throws IOException {
        return FileUtils.readFileToString(new File(filePath), Charset.defaultCharset());
    }
}

相关问题