【发布时间】:2022-06-16 16:27:09
【问题描述】:
我有一个在 Azure Kubernetes 中运行的 Spring Boot 应用程序。该应用程序使用 Liquibase (Liquibase-Core 4.4.3) 在启动时为应用程序创建和修改数据库表。出于安全原因,应用程序对 Liquibase 用户具有不同的数据库凭据,并且 Liquibase 用户凭据是通过 application.properties 文件添加的,如下所示,使用环境变量:
spring.liquibase.url=${env_db_connection_url}
spring.liquibase.user=${env_db_lb_username}
spring.liquibase.password=${env_db_lb_password}
我们使用此方法添加凭据和环境变量,因为凭据因应用程序部署到的环境(例如 UAT、生产环境)而异,这允许管道处理差异而无需对代码。
我们的安全团队希望我们停止使用环境变量,因此我们正转向使用 csi 驱动程序来处理任何敏感信息。这有效地创建了类似于位于应用程序外部但在同一个容器中的外部属性文件。
但是,我现在无法解析 Liquibase 的数据库凭据,而且我不知道实现所需功能的最佳方法。我需要一个解决方案,我们仍然可以标记代码中的值,但它能够从外部属性文件中检索秘密值(数据库密码等)。
正如您可以想象的那样,对这些值进行硬编码甚至只是对它们进行加密都无法解决问题,因为环境之间的值会发生变化。我们能够在应用程序中检索值,但是我觉得这在过程中完成得太晚了,因为 Liquibase 在应用程序代码运行之前已经尝试启动(因此失败)。
任何帮助或建议将不胜感激。
【问题讨论】:
-
我手头没有完整的例子因此评论,你很可能需要在一个可以从容器中读取这些外部属性文件的类中实现
ApplicationContextInitializer,然后将它们作为弹簧属性注入在应用程序上下文中。 -
感谢您的建议。如果我有任何快乐,我会看看并更新问题
标签: java spring-boot liquibase