Estoy tratando de probar el acceso de uno de mi @RestController
que está asegurado por una configuración personalizada de la primavera de Seguridad. Mi caso de uso es el siguiente: Una HTTP GET
a /someEndpoint
está asegurado con autentificación, sino un HTTP POST
solicitud al mismo punto final no está asegurada. Está funcionando bien cuando arranco aplicación y test con mi frontend o cartero.
Ahora estoy tratando de escribir pruebas con MockMvc
la configuración de seguridad. Ya hice a través de una gran cantidad de respuestas en stackoverflow, pero nada me ayudó.
Mi configuración de prueba tiene el siguiente aspecto:
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = MyController.class)
@WebAppConfiguration
@ContextConfiguration
public class AssessmentControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void init() throws Exception {
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.alwaysDo(print())
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
// some test methods
}
Con esta configuración todos mis puntos finales están asegurados e incluso un HTTP POST
está volviendo un 401
lugar de 201
. También He activado el registro de depuración para la seguridad y en los registros de depuración se dice que la prueba utiliza el default configure(HttpSecurity)
y no puedo encontrar ninguna de mis AntMatchers en los registros:
2018-07-04 19:20:02.829 DEBUG 2237 --- [ main] s.s.c.a.w.c.WebSecurityConfigurerAdapter : Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).
2018-07-04 19:20:03.097 DEBUG 2237 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for org.springframework.security.web.util.matcher.AnyRequestMatcher@1
2018-07-04 19:20:03.127 DEBUG 2237 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes
2018-07-04 19:20:03.130 DEBUG 2237 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes
2018-07-04 19:20:03.161 INFO 2237 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5a75ec37, org.springframework.security.web.context.SecurityContextPersistenceFilter@3f736a16, org.springframework.security.web.header.HeaderWriterFilter@529c2a9a, org.springframework.security.web.csrf.CsrfFilter@7f93dd4e, org.springframework.security.web.authentication.logout.LogoutFilter@707b1a44, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@26c89563, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1e0a864d, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@22ebccb9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@53abfc07, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4aa21f9d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2c05ff9d, org.springframework.security.web.session.SessionManagementFilter@26bbe604, org.springframework.security.web.access.ExceptionTranslationFilter@4375b013, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@a96d56c]
2018-07-04 19:20:03.236 INFO 2237 --- [ main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring FrameworkServlet ''
2018-07-04 19:20:03.237 INFO 2237 --- [ main] o.s.t.web.servlet.TestDispatcherServlet : FrameworkServlet '': initialization started
¿Es posible en general usar mi configuración concreta primavera de Seguridad durante una MockMvc
prueba o qué tengo que arrancar todo el contexto de primavera durante la prueba con @SpringBootTest
? Estoy usando (primavera de arranque 2.0.3.RELEASE con Java 1.8)
¡Gracias por adelantado!
Con la 2.x resorte de arranque no es posible pasar de la seguridad con una propiedad más. Tienes que escribir un SecurityConfiguration propia que tiene que ser añadido a su contexto de prueba. Esta configuración de seguridad debe permitir que ninguna solicitud sin autenticación.
@Configuration
@EnableWebSecurity
public class TestSecurityConfiguration extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests().anyRequest().permitAll();
}
@Override
public void configure(WebSecurity web) throws Exception{
web.debug(true);
}
}
prueba de la anotación de la clase:
@ContextConfiguration(classes = { ..., TestSecurityConfiguration.class })
public class MyTests {...