ServletContainerRedirectHttpToHttpsConfiguration.java
package pk.lucidxpo.ynami.spring.security;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import static java.lang.Integer.parseInt;
import static org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.DEFAULT_PROTOCOL;
@Configuration
@Profile("https")
@ConditionalOnProperty(name = "config.redirect.http.to.https.enabled", havingValue = "true")
public class ServletContainerRedirectHttpToHttpsConfiguration {
@Bean
public ServletWebServerFactory servletContainer(@Value("${server.secure.port}") final String serverSecurePort,
@Value("${server.insecure.port}") final String serverInsecurePort) {
final TomcatServletWebServerFactory tomcatServletWebServerFactory = getTomcatServletWebServerFactory();
final Connector portRedirectHttpConnector = getPortRedirectHttpConnector(serverSecurePort, serverInsecurePort);
tomcatServletWebServerFactory.addAdditionalTomcatConnectors(portRedirectHttpConnector);
return tomcatServletWebServerFactory;
}
private TomcatServletWebServerFactory getTomcatServletWebServerFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(final Context context) {
final SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
final SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
}
private Connector getPortRedirectHttpConnector(final String serverSecurePort, final String serverInsecurePort) {
final Connector connector = new Connector(DEFAULT_PROTOCOL);
connector.setSecure(false);
connector.setScheme("http");
connector.setPort(parseInt(serverInsecurePort));
connector.setRedirectPort(parseInt(serverSecurePort));
return connector;
}
}