Saltar al contenido

El token Spring CSRF no funciona, cuando la solicitud que se enviará es una solicitud de varias partes

Solución:

Si está usando @annotations, y la vista jsp como esta:

    <form:form id="profileForm" action="profile?id=${param.id}" method="POST" 
          modelAttribute="appUser" enctype="multipart/form-data" >
             ...
            <input type="file" name="file">
             ...
            <input type="hidden" name="${_csrf.parameterName}"
                value="${_csrf.token}" />
    </form:form>

esto puede ayudar:

AppConfig.java:

@EnableWebMvc
@Configuration
@Import({ SecurityConfig.class })
public class AppConfig {

   @Bean(name = "filterMultipartResolver")
   public CommonsMultipartResolver filterMultipartResolver() {
      CommonsMultipartResolver filterMultipartResolver = new CommonsMultipartResolver();
      filterMultipartResolver.setDefaultEncoding("utf-8");
      // resolver.setMaxUploadSize(512000);
      return filterMultipartResolver;
}
...

SecurityConfig.java extiende WebSecurityConfigurerAdapter y es la configuración de SpringSecurity

El filtro multiparte / form-data (MultipartFilter) debe registrarse antes de SecurityConfig que habilita el CSRF. Puedes hacerlo con esto:

SecurityInitializer.java:

public class SecurityInitializer extends
AbstractSecurityWebApplicationInitializer {

@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
   super.beforeSpringSecurityFilterChain(servletContext);

   // CSRF for multipart form data filter:
   FilterRegistration.Dynamic springMultipartFilter;
   springMultipartFilter = servletContext.addFilter(
    "springMultipartFilter", new MultipartFilter());
   springMultipartFilter.addMappingForUrlPatterns(null, false, "/*");

}
}

En este caso, dado que es una solicitud de varias partes en la que el token CSRF no está disponible para la seguridad de Spring a menos que MultipartFilter junto con MultipartResolver está configurado correctamente para que Spring pueda procesar la solicitud de varias partes.

MulipartResolver en el applicationContext.xml el archivo debe registrarse de la siguiente manera

<bean id="filterMultipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 

    <property name="maxUploadSize" value="-1" />
</bean> 

El valor del atributo -1 de maxUploadSize no pone límite al tamaño del archivo cargado. Este valor puede variar según los requisitos. En el caso de varios archivos, el tamaño del archivo es el tamaño de todos los archivos cargados.


También,

<servlet-name>/*</servlet-name> 

de <filter-mapping> de MultipartFilter necesita ser cambiado a

<url-pattern>/*</url-pattern>

Este es un error en la documentación.

Esto funcionará bien, en caso de que sea Spring MVC solo.

pero si es una integración de Spring y Struts (2), incurre en otro problema en la clase de acción Struts asociada. La información del archivo subido será null en las clases de acción de Struts asociadas.

Para resolver este problema en particular, consulte esta respuesta para personalizar una solicitud de varias partes.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *