如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?

Posted

技术标签:

【中文标题】如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?【英文标题】:How to use Flyway in Spring Boot with JDBC Security? 【发布时间】:2015-04-16 23:40:29 【问题描述】:

我想在我的 Spring Boot 项目中使用 Flyway 作为首选的数据库迁移处理方式(使用当前的 V1.2.1.RELEASE)。

到目前为止,这一切正常,但是使用 JDBC 数据源与 Spring Security 的集成似乎覆盖了 Flyway 机制。

以下简单场景:

Spring Boot 1.2.1 PostgreSQL 9.4.1 根据 Spring Security 文档用于用户、组和权限的 Flyway 迁移脚本

问题: Flyway 迁移脚本在启动时未按预期执行。

可能的原因:似乎只有在使用 Spring Boot 项目至少也使用 JPA 的情况下,Flyway 才会在启动时执行。由于 Spring Security 基于普通 JDBC,我尝试临时使用 Spring Boot 文档(第 68.3 章)中描述的基于 JDBC 的数据库初始化方案,但(如文档所述)这种方式就像“穷人方法”我真的很想将 Flyway 也用于这些包含用户/组/权限信息的表。

【问题讨论】:

flyway 的使用与 JPA 或任何现有技术无关(至少它不应该是一个错误)。把你试过的配置贴出来,哪个不行,也多解释一下什么不行。 似乎在 Flyway 迁移发生之前初始化了安全上下文:创建名称为“securityFilterChainRegistration”的bean时出错:org.postgresql.util.PSQLException:错误:关系“用户”不存在根据到日志和数据库没有发生 Flyway 迁移。如果我暂时禁用我的自定义 WebSecurityConfigurerAdapter,为用户和组创建所需表的 Flyway 迁移将在应用程序启动时按预期执行。所以我的猜测是在创建 spring 应用上下文时会出现某种排序问题 【参考方案1】:

好的,经过进一步调查,我发现了问题:

确实,在标准 Spring Boot 项目中,安全上下文会在任何基于 Flyway 的迁移发生之前进行初始化。

通常这不是什么大问题,但我也使用AuthenticationManagerBuilder 创建默认admin 用户。这似乎是创建此类初始用户帐户的错误方法。

【讨论】:

是的,您不应该这样做,尤其是在配置类中,因为它们很早就初始化了。我已经在其他地方评论说这是一件坏事,最好放在 ApplicationListener<ContextRefreshedEvent> 中,在初始化所有内容后调用它。

以上是关于如何在具有 JDBC 安全性的 Spring Boot 中使用 Flyway?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 管理具有不同 jdbc(或休眠?)的多个“运行时注意到”数据库连接?

Spring JDBC:如何创建表?

Spring Security JDBC 和 Hibernate JPA

jdbc spring 安全性,apache commons dbcp

具有动态查询的 Jdbc 消息源的 Spring 集成流

java Spring安全性JDBC身份验证