Je suis un système équipé ces exigences:Jetty intégré + Spring MVC + sécurité Spring + Https
- Spring MVC
- jetée 9 intégré
- Spring Security sur Https
printemps Boot pourrait être un bon point de départ, mais cela ne fonctionne pas en raison de notre ancien matériel. Nous devons configurer Spring juste avec ces pièces.
J'ai un code de travail avec Spring MVC, la jetée et de la sécurité du printemps, mais sur Http:
Spring Security:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${web.security.http.username1}") private String webUser1;
@Value("${web.security.http.password1}") private String webPassword1;
private static String REALM = "MY_TEST_REALM";
@Autowired
protected void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception, BadCredentialsException {
auth.inMemoryAuthentication()
.withUser(webUser1).password(webPassword1).roles("USER");
}
/**
* Ignored resources
*/
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring().antMatchers("/css/**", "/js/**", "/webjars/**")
.and()
.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/**").hasRole("USER")
.and()
.csrf()
.and()
.httpBasic().authenticationEntryPoint(entryPoint())
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).sessionFixation().none()
.and()
.headers()
.xssProtection()
.and()
.frameOptions()
.and()
.httpStrictTransportSecurity()
.includeSubDomains(true)
.maxAgeInSeconds(60 * 60)
.and()
.contentTypeOptions()
.and()
.contentSecurityPolicy(""
+ "default-src 'self'; "
+ "script-src 'self'; "
+ "connect-src 'self'; "
+ "img-src 'self'; "
+ "font-src 'self'; "
+ "frame-ancestors 'none'; "
+ "base-uri 'self'; "
+ "form-action 'self'; "
+ "style-src 'self' 'unsafe-inline' 'unsafe-eval'; ")
.and()
// internet explorer
.addHeaderWriter(new StaticHeadersWriter("X-Content-Security-Policy","sandbox"));
}
@Bean
public BasicAuthenticationEntryPoint entryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName(REALM);
return entryPoint;
}
}
Configuration Jetty:
@Bean
public WebAppContext jettyWebAppContext() throws IOException {
WebAppContext webUiContext = new WebAppContext();
webUiContext.setContextPath(jettyContextPath);
webUiContext.setWar(new ClassPathResource("webapp").getURI().toString());
webUiContext.setInitParameter("dirAllowed", "false");
webUiContext.setParentLoaderPriority(true);
GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext();
webApplicationContext.setParent(applicationContext);
webApplicationContext.refresh();
webUiContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);
webUiContext.addEventListener(new WebMvcContextInit());
webUiContext.addFilter(
new FilterHolder(new DelegatingFilterProxy(
AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)),
"/*", EnumSet.allOf(DispatcherType.class)
);
return webUiContext;
}
@Bean(initMethod = "start", destroyMethod = "stop")
public Server jettyServer() throws IOException {
JettyConfigurationMapper mappedFile = readJettyAccessConfigurationMapper();
Server server = new Server(new InetSocketAddress(jettyHost, jettyPort));
InetAccessHandler inetAccessHandler = buildInetAccessHandler(mappedFile);
server.setHandler(inetAccessHandler);
inetAccessHandler.setHandler(jettyWebAppContext());
return server;
}
Lorsque Je change la configuration de la jetée en https avec le code suivant, je ne vois que 403 Forbidden
dans le navigateur, avec toute forme de sécurité (http auth de base):
@Bean(initMethod = "start", destroyMethod = "stop")
public Server jettyServer() throws IOException {
System.setProperty("jsse.enableSNIExtension", "false");
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(jettyPort);
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
httpsConfig.addCustomizer(new SecureRequestCustomizer());
Resource jksFile = resourceLoader.getResource("classpath:" + myKeystoreJks);
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(jksFile.getURL().toExternalForm());
sslContextFactory.setKeyStorePassword(myKeystorePassword);
Server server = new Server(new InetSocketAddress(jettyHost, 8080));
ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory, "http/1.1"),
new HttpConnectionFactory(httpsConfig));
sslConnector.setPort(jettyPort);
server.setConnectors(new Connector[] { sslConnector });
JettyConfigurationMapper mappedFile = readJettyAccessConfigurationMapper();
InetAccessHandler inetAccessHandler = buildInetAccessHandler(mappedFile);
server.setHandler(inetAccessHandler);
inetAccessHandler.setHandler(jettyWebAppContext());
return server;
}
EHRM pourquoi ne pas le printemps démarrage travailler ?! Si vous pouvez le faire, Spring Boot devrait aussi fonctionner, sans que vous ayez à réinventer la roue. –
Je suis d'accord. Honnêtement, nous ne savons pas pourquoi. C'est un système extrêmement lent. Nous avons personnalisé les importations même paresseux et jetty à la place tomcat, mais le programme pourrait prendre jusqu'à 40 minutes au démarrage avec démarrage au printemps et 5 secondes avec cette configuration personnalisée. Peut-être lire des pot? – crm86