import org.springframework.beans.factory.annotation.Value;
public class Example {
private final String databasePassword;
public Example(
@Value("${database.password}") String databasePassword) {
this.databasePassword = databasePassword;
}
}
@SpringBootApplication
@EnableConfigurationProperties({MagicProperties.class, ArctosProperties.class})
public class SimpleWebServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SimpleWebServiceApplication.class, args);
}
}
@ConfigurationProperties("arctos")
record ArctosProperties(String cold) {
}
@ConfigurationProperties("magic")
record MagicProperties(String value1, int value2) {
}
@RestController
@RequiredArgsConstructor // lombok annotation pure constructor can be used
class HelloController {
private final MagicProperties magicProperties;
private final ArctosProperties arctosProperties;
@GetMapping("/magic")
public MagicProperties magic() {
return magicProperties;
}
@GetMapping("/arctos")
public ArctosProperties arctos() {
return arctosProperties;
}
}
3条答案
按热度按时间rqmkfv5c1#
首先,对
application.properties
的秘密数据使用环境变量是不安全的。当你谈论秘密时,你主要有两个选择。
1.如果您使用的是Docker Secrets而不是Docker Swarm,那么您可以直接在secret中加载整个
application.properties
,将其挂载在/run/secrets
下,并将其作为带有Spring标志的配置文件引用。1.如果您将Docker Secrets与Docker Swarm一起使用,则可以将您感兴趣的具体字段存储为secret,并使用Swarm的配置模板将其关联起来。
示例:
应用程序.属性.tmpl
停靠-撰写.yml
当您使用
docker stack deploy -c docker-compose.yml myapp
进行部署时,它将自动使用机密的内容填充配置,并将其装载到目标路径中。rur96b6h2#
如果您订阅了configuration上的 * 十二因素应用 * 理念,则环境变量是存储应用机密的适当位置。
特别是使用Sping Boot ,可以将它们设置为容器中的env变量,遵循
UPPER_SNAKE_CASE
命名约定,Map到application.properties
或application.yml
文件中的键。例如,如果您希望将数据库密码设置为好像它在application.properties
文件中定义为database.password=i-am-the-password
,但在版本控制中忽略它,则可以执行以下操作:(Or另一种将env var注入容器运行时的方法。)
然后,可以在Java代码中访问数据库口令,如下所示:
lnxxn5zx3#
目前在Spring这是非常容易的。
首先让我们创建2个秘密:
在magic.yml和arctos.yml之上是配置文件,您希望将其作为Docker机密保存,例如:
北极圈.yml
魔术.yml
现在,让我们创建Sping Boot 简单应用程序:
应用程序.yml
停靠-撰写.yml
现在运行:
又叫:
后脚本
事实上,我们可以让我们的应用程序更加灵活。例如,如果在开发/测试期间,我们不想使用机密,我们可以稍微扩展我们的应用程序
application.yml,我们通过
docker-compose.yml我们通过
在这种情况下,当机密没有与我们的服务链接时,将使用环境值。(实际上,如果您提供环境值,它们将具有优先级,因此最终它们将获胜)。