我应该将开发凭据存储在Spring Boot项目中的哪个位置?

时间:2017-08-26 21:43:18

标签: spring spring-boot credentials

我应该将开发凭据存储在Spring Boot项目中,以便它们不会提交到存储库?什么是最标准的方式?

在其他框架(Rails,Clojure)中,我习惯拥有一个文件,我不会将该信息提交到repo。类似于辅助application.properties的东西,它们被合并并且从未提交过。这样的事情存在吗?

我正在部署到Heroku,它提供Spring可以获取的环境变量的凭据,因此,该部分已经解决。如果我在其他地方部署,它将是一个类似的配置。

Spring Boot Docs, chapter 24, Externalized Configuration中,列出了定义属性的所有位置。我查看了该列表,试图找到合适的凭据位置,但我找不到它:

  

您的主目录上的Devtools全局设置属性       (当devtools处于活动状态时,〜/ .spring-boot-devtools.properties。)

这不是一个devtools事情,因为你可能想要开发本地禁用devloots。

  

@TestPropertySource测试注释。

这不是关于测试

  

测试时的@ SpringBootTest#properties annotation属性。

再次,不测试。

  

命令行参数。

我宁愿在命令行中没有凭据,因为那些通常在计算机中公开,所以,另一个程序可以接收它们。但除此之外,我在开发时并没有运行命令;我正在从IntelliJ触发应用程序。

  

SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)

与下面的环境变量/系统属性相同。

  

ServletConfig init参数。   ServletContext init参数。   来自java:comp / env。

的JNDI属性

在开发本地生成罐子时,似乎根本不适用

  

Java系统属性(System.getProperties())。

我不确定以什么方式设置它们,但感觉很费力。

  

OS环境变量。

我要么在我的操作系统上设置它们,这对新开发人员来说是不透明的,或者我将它们设置在IntelliJ运行配置文件中,这使它们成为存储库的一部分,这正是我想要避免的。

  

一个只有随机属性的RandomValuePropertySource。*。

它们不是随机的。

  

打包jar之外的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)

这可能是,但我不确定该文件应该驻留在哪里。

  

打包在jar中的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)

我希望能够向配置文件提交配置文件特定的应用程序属性,因此,我无法在这些文件中存储凭据。

  

打包jar之外的应用程序属性(application.properties和YAML变体)。

这可能是,但我不确定该文件应该驻留在哪里。

  

打包在jar中的应用程序属性(application.properties和YAML变体)。

我想提交该文件,因此,我无法在那里存储凭据。

  

@Configuration类上的@PropertySource注释。默认属性       (使用SpringApplication.setDefaultProperties指定)。

使用这样的东西,我可以自己制作东西,从未提交的文件中挑选属性,但我有兴趣遵循Spring Boot的最佳和常用做法,而不是自己制作;特别是因为我刚开始。

2 个答案:

答案 0 :(得分:9)

Spring-boot允许您在不同的位置外部化您的配置。对于相关方案,可以在application.properties下放置${PROJECT_ROOT}/config/文件。 这些属性将覆盖任何其他已定义的属性。 在这种情况下,它不会打包在可部署的工件中 请查看Application property files了解更多详情。

config/application.properties.example下提供示例配置文件作为一个很好的起点。该文件可以是版本控制的。 为了避免无意的提交,请忽略其他所有内容。

使用git,忽略文件可能包含以下代码段(忽略除.exampleREADME.md以文件结尾的文件之外的所有内容:

的.gitignore

/config/*
!/config/README.md
!/config/*.example

答案 1 :(得分:0)

这取决于您的配置。感谢Spring的Environment抽象,您可以在运行时从环境覆盖属性,因此根据您的部署,有很多方法可以做到这一点。然而,要警告说,虚假的安全感可能是一个真正的痛苦。您希望将配置维护为代码 - 可以进行版本化,审查和审计,而不是作为用于注入随机运行时变量的某人PC上的文本文件。这是经典的“在我的机器上工作”的问题。

你没有说出你的部署,所以几乎不可能说;如果您使用的是Tomcat,则可以使用setenv.sh。你现在的问题很模糊;我会在您更新帖子时更新我的​​答案。

编辑,根据OP在评论中所说的内容:

您可以只提供键值对作为JVM变量。例如,如果使用Gradle构建,则可以执行gradle clean bootRun -Dmy.secret.key=whatever,并build.gradle

bootRun {
  systemProperties = System.properties
}

您还可以保留一个未提交给Git的application-local.properties,并使用-Dspring.profiles.active=default,local个人资料启动该应用,在这种情况下,Spring会合并application.propertiesapplication-local.properties,优先考虑后者。就像我之前说的那样,这是一个非常糟糕的想法,但你是一个自由的人,所以......

Spring Boot本身没有加密属性的一流支持,但是如果你愿意自己做,你可以提交所有内容,并启动应用程序传递密钥,或以某种方式管理它您的构建环境(如Maven settings.xml中的属性)。

编辑2 ,如何在运行时使用env变量覆盖application.properties中的属性:

my.secret.key=${MY_SECRET_KEY:default}

如果存在env变量MY_SECRET_KEYmy.secret.key将等于它的值;否则它将等于default