如何使用JDBC-Spring Boot/Spring安全认证与Flyway

How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway

我正在尝试设置我的 spring 启动应用程序,该应用程序使用 spring 安全文档附录中提供的 jdbcAuthentication 和默认数据库方案来验证其用户。但是我在数据库初始化期间遇到了这个异常:

org.flywaydb.core.api.FlywayException: Found non-empty schema "PUBLIC" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.

身份验证管理器的配置如下所示:

    @Configuration
    @EnableWebMvcSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

        @Autowired
        private DataSource dataSource;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .httpBasic()
                    .realmName("shipment2rss")
                    .and()
                .logout()
                    .permitAll();
        }

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .jdbcAuthentication()
                    .dataSource(dataSource)
                        .withDefaultSchema();
        }

    }

我读到问题似乎是在执行 Flyway 相关代码之前调用了方法 configureGlobal(AuthenticationManagerBuilder )(请参阅 ),但没有找到如何进行的分步指南解决这个特定问题。

任何人都可以给我这样的指南或指向一个网站吗?

编辑 我在 github 上传了一个项目来显示问题:https://github.com/smilingj/springboot-authentication-flyway-sample/tree/e48ce63568776d99e49a9548d8362168cc3a3367

在配置 jdbcAuthentication 和调用 withDefaultSchema 时直接创建模式,并在 Flyway 对创建模式进行任何更改之前执行此操作。

Flyway 现在检测到它已经存在,而不是允许它创建模式,并且它对此进行了抱怨。

您有 2 种可能的解决方案

  1. 扩展 FlywayMigrationStrategy 并将 baselineOnMigrate 属性 设置为 true
  2. 更好的办法是让 Flyway 完成所有的数据库迁移。要启用该功能,请删除对 withDefaultSchema 的调用,只需添加 sql 即可为 Flyway 创建 Spring 安全表。 SQL 文件是 Spring 安全分发的一部分。