我应该将开发凭据存储在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的最佳和常用做法,而不是自己制作;特别是因为我刚开始。
答案 0 :(得分:9)
Spring-boot允许您在不同的位置外部化您的配置。对于相关方案,可以在application.properties
下放置${PROJECT_ROOT}/config/
文件。
这些属性将覆盖任何其他已定义的属性。
在这种情况下,它不会打包在可部署的工件中
请查看Application property files了解更多详情。
在config/application.properties.example
下提供示例配置文件作为一个很好的起点。该文件可以是版本控制的。
为了避免无意的提交,请忽略其他所有内容。
使用git
,忽略文件可能包含以下代码段(忽略除.example
和README.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.properties
和application-local.properties
,优先考虑后者。就像我之前说的那样,这是一个非常糟糕的想法,但你是一个自由的人,所以......
Spring Boot本身没有加密属性的一流支持,但是如果你愿意自己做,你可以提交所有内容,并启动应用程序传递密钥,或以某种方式管理它您的构建环境(如Maven settings.xml
中的属性)。
编辑2 ,如何在运行时使用env变量覆盖application.properties
中的属性:
my.secret.key=${MY_SECRET_KEY:default}
如果存在env变量MY_SECRET_KEY
,my.secret.key
将等于它的值;否则它将等于default
。