2015-08-18 19 views
5

İlkbahar MVC projemde basit bir form aracılığıyla bir dosya yüklemeye çalışıyorum.Dosya İadesi Yükleniyor 403 Hata - Bahar MVC

HTML Form:

<form method="POST" enctype="multipart/form-data" action="/upload"> 
    <label>Select File</label> 
    <input type="file" name="file"/> 
</form> 

My Denetleyici:

@Controller 
public class FileController { 
    @RequestMapping(value="/upload", method=RequestMethod.POST) 
     public @ResponseBody String handleFileUpload(
       @RequestParam("name") String name, 
       @RequestParam("file") MultipartFile file){ 
      if (!file.isEmpty()) { 
       try { 
        //do stuff 
       } catch (Exception e) { 
        return "You failed to upload " + name + " => " + e.getMessage(); 
       } 
      } else { 
       return "You failed to upload " + name + " because the file was empty."; 
      } 
     } 
} 

Güvenlik Yapılandırma: Bir 403: Forbidden hatası alıyorum ve benim 403.html yönlendirildi am Ancak

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/upload").permitAll() 
      .and() 
       .exceptionHandling().accessDeniedPage("/403") 
    } 
} 

görmek her süre

Şimdiye kadar ayrı bir sınıfta başlatılır Bahar Güvenlik filtresi önce MultipartFilter belirterek çalıştı, ancak ettik hayır şans

public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

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

Herhangi bir fikir?

GÜNCELLEME:

@Configuration 
@Import({ WebSecurityConfig.class }) 
public class WebAppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     System.out.println(":::Starting My App:::"); 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.register(WebMVCConfig.class); 
     context.setServletContext(servletContext); 
     context.setConfigLocation("com.myApp.configuration"); 
    } 

} 

Ben 403 hata ile aşağıdaki döndürür servlet isteği niteliklerin bir listesi var benim WebAppInitializer dahildir:

javax.servlet.forward.request_uri 
javax.servlet.forward.context_path 
javax.servlet.forward.servlet_path 
__spring_security_scpf_applied 
org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE 
SPRING_SECURITY_403_EXCEPTION 
org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER 
springMacroRequestContext 
themes 
thymeleafEvaluationContext 
org.springframework.security.web.FilterChainProxy.APPLIED 
_csrf 
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.FILTERED 
[email protected]ED 
beans 
springRequestContext 
org.springframework.web.servlet.HandlerMapping.introspectTypeLevelMapping 
org.springframework.web.servlet.DispatcherServlet.FLASH_MAP_MANAGER 
org.springframework.web.servlet.DispatcherServlet.CONTEXT 
org.springframework.core.convert.ConversionService 
execInfo 
org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping 
org.springframework.web.context.request.async.WebAsyncManager.WEB_ASYNC_MANAGER 
org.springframework.web.servlet.resource.ResourceUrlProvider 
org.springframework.web.servlet.DispatcherServlet.OUTPUT_FLASH_MAP 
org.springframework.web.servlet.HandlerMapping.bestMatchingPattern 
org.springframework.security.web.csrf.CsrfToken 
org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER 

Güncelleme # 2: Bu kesinlikle bir CSRF konudur ; Ben benim WebSecurityConfig yılında şunlardır yaptığımda herhangi 403

.csrf().disable() 
+1

web.xml dosyanızı nasıl yapılandırdınız veya DispatcherServlet için WebApplicationInitializer'ı kullanıyor musunuz? Bu kodu gönderebilir misin? Ayrıca, html formunu yüklemek için kullandığınız URL'den de bahset. – Raghu

+0

Bu bir CSRF hatası mı? – holmis83

+0

@Raghu WebAppInitializer'ımı ekledim - formumun URL'si, tüm Thymeleaf görünümlerinin çözüldüğü/WEB-INF/html klasöründe. Ve holmis83 Evet olduğuna inanıyorum –

cevap

5

Bu Bahar Güvenlik referans CSRF - Multipart (File Upload) bölümünde kaplıdır olsun. Bahar Güvenlik İlk seçenek MultipartFilter Bahar Güvenlik filtresi önce belirtilen sağlamaktır

önce MultipartFilter Yerleştirme

: İki seçeneğiniz vardır. Spring Security filtresinden önce MultipartFilter öğesini belirtmek, MultipartFilter'ı çağırmak için herhangi bir yetki olmadığı anlamına gelir; bu, herkesin sunucunuza geçici dosyalar yerleştirebileceği anlamına gelir. Ancak, yalnızca yetkili kullanıcılar, uygulamanız tarafından işlenen bir Dosyayı gönderebilecek. Genel olarak, bu önerilen yaklaşımdır çünkü geçici dosya yükleme çoğu sunucu üzerinde ihmal edilebilir bir etkiye sahip olmalıdır.

MultipartFilter java yapılandırma ile Bahar Güvenlik filtresi önce belirtilen sağlamak için, beforeSpringSecurityFilterChain geçersiz kılabilir kullanıcılar aşağıda gösterildiği gibi: MultipartFilter sağlamak için

public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 

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

XML yapılandırma ile Bahar Güvenlik filtresi önce belirtilen, kullanıcılar sağlayabilirsiniz MultipartFilter öğesinin öğesi, web içinde springSecurityFilterChain'den önce yerleştirilir.olarak xml aşağıda gösterilen:

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
</filter> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

eylem CSRF belirteci dahil yetkisiz kullanıcıların dosyalarını temporariy yüklemek için izin kabul edilebilir değilse, alternatif Bahar Güvenlik filtreden sonra MultipartFilter yerleştirmektir

ve şunları CSRF formun action özniteliğinde bir sorgu parametresi olarak. Bir jsp örneği Bu yaklaşımın dezavantajı bu sorgu parametreleri sızdırılmış olabilir olduğu

<form action="./upload?${_csrf.parameterName}=${_csrf.token}" 
     method="post" 
     enctype="multipart/form-data"> 

aşağıda gösterilmiştir. Daha genel olarak, sızıntı olmadığından emin olmak için vücut veya başlıkların içine hassas verilerin yerleştirilmesi en iyi uygulama olarak kabul edilir. Ek bilgi RFC 2616 Section 15.1.3 Encoding Sensitive Information in URI’s'da bulunabilir.

+0

Teşekkürler Rob, Bahar belgelerini okudum ve bu yöntemlerin her birini denedim ama boşuna. Bir kez daha deneyeceğim ve size geri döneceğim –