2014-03-25 15 views
12

如何輕鬆配置嵌入式tomcat服務器將所有http通信重定向到https?我有一個彈性負載均衡器後面的ec2實例運行Spring Boot。我已經配置了ELB來處理我的SSL(這非常棒),並且它將X-FORWARDED-PROTO頭設置爲「https」。我想檢測何時未設置,並重定向用戶強制他們使用https,如果他們還沒有。如何使用Spring Boot自動重定向到https

到目前爲止,我已經嘗試添加以下到我的application.properties沒有運氣文件:

server.tomcat.protocol-header=x-forwarded-proto 
security.require-ssl=true 
+0

你有一個安全的應用程序(是春季安全的類路徑和它攔截你的請求)?請注意,即使這樣,重定向也不是自動的(Spring Security與HSTS協同工作,要求客戶端理解並遵守頭文件中的指令)。 –

+1

嗨。你解決了這個問題嗎?我們正面臨類似的問題。我們有一個ec2負載均衡器,終止ssl並使用http回到Spring啓動應用程序。我們可以從負載均衡器中刪除https監聽器,但我們寧願做一個重定向到https。 – hermansen

+0

[Spring Boot重定向HTTP到HTTPS]的可能重複(http://stackoverflow.com/questions/26655875/spring-boot-redirect-http-to-https) –

回答

8

我的回答是有點晚了,但我剛剛有這個問題,要張貼這爲我工作的解決方案。

最初,我認爲將tomcat設置爲使用X-Forwarded標頭就足夠了,但Tomcat的RemoteIPValve(通常應該處理這種情況)不適用於我。

我的解決辦法是增加一個EmbeddedServletContainerCustomizer並添加ConnectorCustomizer: (請注意,我使用Tomcat 8此處)

@Component 
public class TomcatContainerCustomizer implements EmbeddedServletContainerCustomizer { 

    private static final Logger LOGGER = LoggerFactory.getLogger(TomcatContainerCustomizer.class); 

    @Override 
    public void customize(final ConfigurableEmbeddedServletContainer container) { 
     if (container instanceof TomcatEmbeddedServletContainerFactory) { 
       final TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container; 
       tomcat.addConnectorCustomizers(connector -> { 
        connector.setScheme("https"); 
        connector.setProxyPort(443); 
       }); 
       LOGGER.info("Enabled secure scheme (https)."); 
     } else { 
      LOGGER.warn("Could not change protocol scheme because Tomcat is not used as servlet container."); 
     } 
    } 
} 

重要的是,你不僅設置計劃,HTTPS,但也ProxyPort沒有從春天啓動所有內部重定向路由到端口80

希望幫助:-)

1

配置屬性security.require-S當基本身份驗證被禁用時(至少在舊版本的Spring Boot上),sl不起作用。所以,你可能需要用類似的代碼手動保證所有的請求這一個:

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Inject private SecurityProperties securityProperties; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     if (securityProperties.isRequireSsl()) http.requiresChannel().anyRequest().requiresSecure(); 
    } 
} 

您可以檢查我的完整的答案在這裏:Spring Boot redirect HTTP to HTTPS

相關問題