2016-07-14 21 views
0

Ich konfigurierte ordnungsgemäß mehrteilige Form in Spring MVC, aber wenn ich Spring Security zu meinem Projekt hinzugefügt habe, kann ich die Datei nicht mehr hochladen. Ich habe keine Ahnung, was das bewirken kann, tatsächlich habe ich jede Lösung ausprobiert, die ich im Stackoverflow gefunden habe.Spring Security erkennt keine mehrteilige Konfiguration

Spring MVC:

public class MvcConfig extends WebMvcConfigurerAdapter { 

@Bean 
public InternalResourceViewResolver viewResolver(){ 
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
    viewResolver.setViewClass(JstlView.class); 
    viewResolver.setPrefix("/WEB-INF/views/"); 
    viewResolver.setSuffix(".jsp"); 
    return viewResolver; 
} 

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

@Override 
public void addResourceHandlers(final ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
} 

ServletInitializer:

public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

@Override 
protected Class<?>[] getServletConfigClasses() { 
    return new Class[]{MvcConfig.class}; 
} 

@Override 
protected String[] getServletMappings() { 
    return new String[]{"/"}; 
} 

@Override 
protected Class<?>[] getRootConfigClasses() { 
    return new Class[]{MessageSecurityWebApplicationInitializer.class, SecurityConfig.class}; 
} 

Sicherheitskonfiguration:

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth 
      .inMemoryAuthentication() 
      .withUser("user").password("password").roles("USER") 
      .and() 
      .withUser("admin").password("1234").roles("USER", "ADMIN"); 
} 


@Override 
public void configure(WebSecurity web) throws Exception { 
    web 
      .ignoring() 
      .antMatchers("/resources/**"); // #3 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/", "/login", "/getPhoto/{id}", "/deletePhoto/{id}").permitAll() 
      .antMatchers("/remove").hasRole("ADMIN") 
      .antMatchers("/add/**", "/upload/**").hasAnyRole("ADMIN", "USER") 
      .anyRequest().authenticated() // 7 
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .successForwardUrl("/") 
      .usernameParameter("userLogin") 
      .passwordParameter("userPassword") 
      .failureForwardUrl("/login?error=true"); 
} 

MessageSecurityWebApplicationInitializer

public class MessageSecurityWebApplicationInitializer 
    extends AbstractSecurityWebApplicationInitializer { 


@Override 
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { 
    insertFilters(servletContext, new MultipartFilter()); 
} 

hochladen Abbildung:

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public String uploadWallpaper(@RequestParam("wallpaperFile") MultipartFile file, 
           @RequestParam("category") String category) { 
    Wallpaper wallpaper = new Wallpaper(); 

    try { 
     wallpaper.setName(file.getOriginalFilename()); 
     wallpaper.setData(file.getBytes()); 
     wallpaper.setCategory(category); 
     serviceDAO.addObject(wallpaper); 

     return "redirect:/"; 
    } catch (IOException e) { 
     return "add_wallpaper"; 
    } 
} 

HTML-Formular:

<spring:url value="/upload?${_csrf.parameterName}=${_csrf.token}" var="formURL"/> 
    <form method="post" enctype="multipart/form-data" action="/upload?${_csrf.parameterName}=${_csrf.token}"> 
... 

Ausnahme ich noch empfangen:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided 
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111) 
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:85) 
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76) 
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
+0

Sie haben nur eine MVC-Konfiguration, der 'MultipartFilter' betrachtet den Root-Kontext für seine Beans, die Sie nicht haben. Daher wird nichts aus der Sicht des Filters erkannt. –

Antwort

0

ich verwendet, um dieses config:

@Bean 
public CommonsMultipartResolver multipartResolver(){ 
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); 
    commonsMultipartResolver.setMaxInMemorySize(MEMORY_SIZE); 
    commonsMultipartResolver.setMaxUploadSize(UPLOAD_SIZE); 
    return commonsMultipartResolver; 
} 

In dem Fall, dass ich keine Klasse mit der Erweiterung AbstractSecurityWebApplicationInitializer erstellt habe. Versuchen Sie, diese Klasse nicht zu verwenden und setzen Sie die obige Bean.

+0

Danke, es funktioniert! Ich dachte, dass diese Klasse notwendig ist. – Tymek