Uso de Spring-Test-MVC para probar la unidad Spring-Security - Integración de FilterChain / ServletFilter

Estamos casi en nuestro objetivo de probar nuestra aplicación spring web-mvc. Usamos Spring Security para asegurar URL o métodos y queremos usar Spring-Web-Mvc para probar los controladores. El problema es: la seguridad de Spring se basa en un FilterChain 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>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

Mientras que spring-web-mvc incluso con un cargador de contexto personalizado solo puede cargar las cosas habituales del contexto de la aplicación:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {
        "file:src/main/webapp/WEB-INF/servlet-context.xml", "file:src/main/webapp/WEB-INF/dw-manager-context.xml" })
public class MvcTest {

    @Inject
    protected MockMvc mockMvc;

    @Test
    public void loginRequiredTest() throws Exception {

        mockMvc.perform(get("/home")).andExpect(status().isOk()).andExpect(content().type("text/html;charset=ISO-8859-1"))
        .andExpect(content().string(containsString("Please Login")));
    }

}

Como se puede ver, configuramos nuestra aplicación web para que cuando llame a /home se le solicite a un usuario anónimo que inicie sesión. Esto funciona bien con el archivo web.xml pero no tenemos idea de cómo integrarlo en nuestras pruebas. .

¿Hay alguna forma de agregar un filtro a spring-test-mvc?

En este momento estoy pensando que podría tener que empezar en el GenericWebContextLoader, cavar en el MockRequestDipatcher que implementa RequestDispatcher, agregue un filtro allí de alguna manera y luego dígale al GenericWebContextLoader para usar mi implementación ... Pero no estoy muy familiarizado con toda la pila web y preferiría una solución más fácil que me ayude a evitar profundizar en esas cosas, obviamente ...

¿Alguna idea/solución por ahí?

¿Cómo agregaría un filtro a mano de todos modos? web.xml no puede ser el único lugar para hacerlo...

¡Gracias!

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Tal vez podrías burlarte de la cadena de filtros. Hay un clase en primavera por hacer eso. El código sería algo como:

     MockHttpServletRequest request = new MockHttpServletRequest();
     request.setServletPath("/foo/secure/super/somefile.html");

     MockHttpServletResponse response = new MockHttpServletResponse();
     MockFilterChain chain = new MockFilterChain(true);

     filterChainProxy.doFilter(request, response, chain);

Luego puede agregar la instancia org.springframework.web.filter.DelegatingFilterProxy a la cadena en su código. Algo como:

Vea también este hilo del foro.

Respondido el 14 de junio de 12 a las 10:06

Sí, también hemos estado pensando en este sentido. Como dije, tendría que extender la implementación spring-test-mvc de RequestDispatcher (MockRequestDipatcher), anular el método de reenvío, obtener el filterChainProxy del contexto actual y luego llame al filtro antes de que se reenvíe la solicitud... O tal vez use un punto de corte... Preferiría usar la configuración xml de alguna manera, ya que está más cerca del original de esa manera, pero parece que no obtendremos nuestro deseo... - Pete

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.