首页 > 解决方案 > Spring Boot 应用程序登录成功后重定向到 http URL

问题描述

我有一个具有以下安全配置的 Spring Boot 应用程序。

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
      String[] csp = {"default-src 'self'",
                "script-src 'self'",
                "style-src 'self'",
                "img-src 'self'", 
                "font-src 'self'",
                "child-src 'self'",
                "form-action 'self' ",
                "frame-ancestors 'none'",
                "manifest-src 'self'"
        };

      http
        .addHeaderWriter(new StaticHeadersWriter("Content-Security-Policy", String.join(";", csp)))
        .loginPage("/login")
        .loginProcessingUrl("/login")
        .defaultSuccessUrl("/landing");
    }
}

我点击 URL https://my-app.com/login,输入正确的用户名和密码,然后单击登录。我收到一条错误消息说

拒绝将表单数据发送到“ http://my-app.com/ ”,因为它违反了以下内容安全策略指令:“form-action 'self'”。

我不确定为什么我的应用程序重定向到 http URL 而不是 https 一个。我想将成功登录重定向到 https URL

标签: javaspring-boottomcat

解决方案


它与 Spring Boot 本身无关。您必须配置您的网络服务器或应用程序服务器(我想在这种情况下是嵌入式 tomcat)您能分享您的 application.properties 吗?您是否配置了 SSL?如果是的话,可以通过TomcatEmbeddedServletContainerFactory的postProcessContext方法,通过创建一个Bean来实现https重定向,如下:

TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
    @Override
    protected void postProcessContext(Context context) {
        SecurityConstraint securityConstraint = new SecurityConstraint();
        securityConstraint.setUserConstraint("CONFIDENTIAL");
        SecurityCollection collection = new SecurityCollection();
        collection.addPattern("/*");
        securityConstraint.addCollection(collection);
        context.addConstraint(securityConstraint);
    }
};

推荐阅读