es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prueba de seguridad de Spring con MockMvc, MockHttpServletRequestBuilder::con usuario sobre https.

Tengo un problema con https en una prueba de Spring.

En mi aplicación uso una clase personalizada que implementa UserDetails, por eso, cuando uso la anotación @WithMockUser, el resultado es una excepción de tipo cast:
org.springframework.security.core.userdetails.User no se puede convertir a la clase my.custom.implementation.MyCustomUserDetailsUser.class

Para solucionarlo, me veo obligado a usar el método MockHttpServletRequestBuilder.with():
mockMvc.perform(get(API_URL)
.with(user(myCustomUserDetailsUser)))
.andExpect(status().isOk())

Todo funciona bien, antes de agregar https a la configuración de seguridad. Ahora, cuando uso with, obtengo un error 500

Sé que al usar MockMvc, necesito crear un bean y establecer defaultRequest(METHOD(“/”).secure(true))
¿Pero cómo lidiar con MockHttpServletRequestBuilder::with? ¿Hay algo así en MockMvc?
¿O tal vez hay algo como MockHttpsServletRequestBuilder::with?

@ edit

El problema principal es que cuando uso un bean para la prueba:
@Bean
public MockMvc mockMvc(WebApplicationContext context) {
return MockMvcBuilders
.webAppContextSetup(context)
.defaultRequest(get(“/”).secure(true))
.build();
}
las pruebas que uso con .with (user (myCustomUserDetailsUser))) fallan con una respuesta 500 (los principios son nulos)

Cuando elimino el bean y establezco:
mockMvc.perform(get(API_URL).secure(true).with(user(myCustomUserDetailsUser)))
todo funciona bien.
Pero no quiero establecer .secure(true) para todas las pruebas (100+).

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con el uso de HTTPS en la configuración de seguridad de la aplicación. Al utilizar MockMvc y la anotación @WithMockUser junto con una implementación personalizada de UserDetails, se produce una ClassCastException. Para evitar esto, se utiliza el método MockHttpServletRequestBuilder.with(). Sin embargo, las pruebas fallan cuando se habilita HTTPS en la configuración de seguridad.

    Para resolver este problema, el bean MockMvc debe configurarse para usar HTTPS estableciendo .defaultRequest(get("/").secure(true)) en la configuración. Para utilizar el método MockHttpServletRequestBuilder.with() con HTTPS, se puede encadenar con .secure(true), de la siguiente manera:

    mockMvc.perform(get(API_URL).with(user(myCustomUserDetailsUser)).secure(true))
                    .andExpect(status().isOk())
    

    Esto debería permitir que las pruebas se ejecuten correctamente con HTTPS habilitado. Sin embargo, si es necesario establecer esto para todas las pruebas, podría valer la pena reconsiderar la configuración de seguridad o buscar la creación de un método de utilidad para establecer esto automáticamente.

Comments are closed.