example - Pruebas de integración Spring MVC con Spring Security
spring security spring boot (2)
Añadir en pom.xml
<repository>
<id>spring-snaspho</id>
<url>http://repo.springsource.org/libs-milestone/</url>
</repository>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<version>4.0.0.M1</version>
</dependency>
y use org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors para la solicitud de autorización. Consulte el uso de muestra en https://github.com/rwinch/spring-security-test-blog ( https://jira.spring.io/browse/SEC-2592 )
Estoy tratando de probar mi página de inicio de sesión usando mvc-test. Estaba trabajando bastante bien antes de agregar seguridad de primavera.
Mi código es:
mockMvc.perform(
post("j_spring_security_check")
.param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue)
.param(LOGIN_FORM_PASSWORD_FIELD, testPasswordValue))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().attribute(LOGIN_PAGE_STATUS_VALUE, LOGIN_PAGE_STATUS_FALSE_INDICATOR));
La clase de prueba tiene anotaciones correctas agregadas:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
Mi filtro está definido (en web.xml):
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Cuando intento agregar web.xml en @ContextConfiguration falla, cuando lo elimino, obtengo una excepción:
java.lang.AssertionError: Status expected:<200> but was:<405>
¿Hay alguna forma de agregar DelegatingProxyFilter para probar el contexto con la configuración definida en mi security-context.xml para que funcione? Intenté algunos tutoriales con la inyección de FilterProxyChain, pero no está funcionando en mi caso.
¿Puede alguien ayudarme con eso? Gracias por adelantado
ACTUALIZACIÓN : Spring Security 4+ proporciona integración inmediata con MockMvc . Para poder usarlo, asegúrese de usar apply(springSecurity())
como se muestra a continuación:
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MockMvcSecurityTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}
...
}
Respuesta original
No estoy seguro de qué quiere decir con "Cuando intento agregar web.xml en @ContextConfiguration falla", sin embargo, puede usar Spring Test MVC para validar Spring Security. Hay un muy buen ejemplo descrito en el proyecto spring-test-mvc .
El esquema básico se vería algo así:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
public class MyTests {
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilters(this.springSecurityFilterChain).build();
}
}
La idea es que @Autowire
el FilterChainProxy
(a lo que delegateProxyFilter delegate) e MockMvc
a MockMvc
que use el FilterChainProxy
.
NOTA spring-test-mvc está integrado en spring-test-3.2 + y un proyecto separado para Spring 3.1.x, por lo que puede usar el ejemplo de forma bastante intercambiable (spring-test-mvc no tiene soporte para @WebAppConfiguration
y debe usarlo WebContextLoader
en WebContextLoader
lugar).