0

私はSpring MVCで適切にマルチパート・フォームを設定しましたが、Spring Securityをプロジェクトに追加するとファイルをアップロードできなくなりました。私は、実際に私はstackoverflowで見つけたすべてのソリューションを試してみました、これを引き起こす可能性がある、私は考えていません。Spring Securityはマルチパート設定を検出しません

春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}; 
} 

セキュリティ設定:

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()); 
} 

アップロードマッピング:

@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フォーム:私はまだ受け

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

例外:

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

あなたはmvcの設定しか持っていません。 'MultipartFilter'はあなたが持っていないBeanのルートコンテキストを調べます。したがって、フィルタの視点からは何も検出されません。 –

答えて

0

私は、この設定を使用:

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

を継承するクラスを作成しなかった場合AbstractSecurityWebApplicationInitializer。そのクラスを使用せずに上記のBeanを設定してください。

+0

ありがとう、それは動作します!私はこのクラスが必要だと思った。 – Tymek

関連する問題