Sirviendo recursos web estáticos en la aplicación Spring Boot y Spring Security
Estoy intentando desarrollar la aplicación web Spring Boot y protegerla utilizando la configuración Java de seguridad Spring.
Después de colocar mis recursos web estáticos en ' src/main/resources/public ' como se recomienda aquí en el blog de Spring , puedo obtener los recursos estáticos. es decir, presionar https://localhost/test.html
en el navegador muestra el contenido html.
Problema
Después de habilitar Spring Security, acceder a la URL del recurso estático requiere autenticación.
Mi configuración relevante de Spring Security Java se ve así: -
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.
authorizeRequests()
.antMatchers("/","/public/**", "/resources/**","/resources/public/**")
.permitAll()
.antMatchers("/google_oauth2_login").anonymous()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/home")
.and()
.csrf().disable()
.logout()
.logoutSuccessUrl("/")
.logoutUrl("/logout") // POST only
.and()
.requiresChannel()
.anyRequest().requiresSecure()
.and()
.addFilterAfter(oAuth2ClientContextFilter(),ExceptionTranslationFilter.class)
.addFilterAfter(googleOAuth2Filter(),OAuth2ClientContextFilter.class)
.userDetailsService(userService);
// @formatter:on
}
¿Cómo debo configurar antMatchers para permitir recursos estáticos colocados dentro de src/main/resources/public?
Hay un par de cosas a tener en cuenta:
- Los comparadores Ant coinciden con la ruta de la solicitud y no con la ruta del recurso en el sistema de archivos.
- Los recursos colocados
src/main/resources/public
se entregarán desde la raíz de su aplicación. Por ejemplosrc/main/resources/public/hello.jpg
se serviría desdehttp://localhost:8080/hello.jpg
Es por eso que su configuración de comparación actual no ha permitido el acceso a los recursos estáticos. Para /resources/**
que funcione, tendrías que colocar los recursos src/main/resources/public/resources
y acceder a ellos en http://localhost:8080/resources/your-resource
.
Mientras usa Spring Boot, es posible que desee considerar usar sus valores predeterminados en lugar de agregar configuración adicional. Spring Boot, de forma predeterminada, permitirá el acceso a /css/**
, /js/**
, /images/**
y /**/favicon.ico
. Podría, por ejemplo, tener un archivo con nombre src/main/resources/public/images/hello.jpg
y, sin agregar ninguna configuración adicional, sería accesible http://localhost:8080/images/hello.jpg
sin tener que iniciar sesión. Puede ver esto en acción en la prueba de humo de seguridad del método web donde se permite el acceso al CSS Bootstrap. archivo sin ninguna configuración especial.
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/resources/**"); // #3
}
Ignore cualquier solicitud que comience con "/resources/". Esto es similar a configurar http@security=none cuando se utiliza la configuración del espacio de nombres XML.